OBJ-Cでのキャラクターエンコーディングに対処する方法は?
-
27-09-2019 - |
質問
私はOBJ-Cが初めてです(私の経験はJavaとLittle Cです)
私は最近このプロジェクトを持っています。これはアラビア語のテキスト暗号化です。アラビア語のテキストファイル(文字ごと)を読む必要がありますが、これらの文字を使用して変数(タイプのチャーの)に保存するときはできません。 'T ..この行でこの警告「マルチキャラクター文字定数」を与えてくれます。
char c = 'ب'; //ここで、文字「bah」をchar変数に保存しようとしています
エンコードの問題だと思いますが、問題が正確に何なのかわかりません。過去2日間は解決策を探して費やしましたが、それを見つけることができませんでした:( ..
前もって感謝します :)
解決
Chracter Viewerは、あなたのキャラクターがUnicode番号0x628であることを教えてくれます。わずか8ビットの1枚のチャーに保存するには大きすぎます。良いニュースは、それがユニカーに収まるということです。
unichar c = 'ب';
うまくいくかもしれません。しかし、コンパイラは、限られた文字セットの外で文字を処理できることを保証しません。安全のために、UTF-16を明示的に使用することをお勧めします(これは、NSStringsが内部で使用するものです。
unichar c = 0x628; // Arabic Beh (UTF-16)
または、UTF-8を好む場合、そのユニコード番号のUTF-8エンコードはD8 A8です。
char c[2] = { 0xD8, 0xA8 }; // Arabic Beh (UTF-8)
編集:
キャラクターをnsstringに入れるいくつかの方法:
使用-stringwithformat:
NSString* foo = [NSString stringWithFormat: @"beh %C", (unichar) 0x628];
または
NSString* foo = [NSString stringWithUTF8String: "beh \xD8\xAB"];
他のヒント
Objective-CでUnicodeに対処したい場合は、使用する必要があります NSString
それ以外の char
タイプ。 NSString
Unicodeを扱うように設定されています。
使用する characterAtIndex
に 文字列をループします
for (characterIndex = 0; characterIndex < [myString length]; characterIndex++)
{
unichar testCharacter = [myString characterAtIndex:characterIndex];
// do stuff
}
試しましたか
unichar
?単純char
エンコーディングに関係なく動作しません。小さすぎます。あなたは本当にシングルキャラクターと一緒に仕事をする必要がありますか?
NSString
しませんか?それはどのような暗号化ですか?その意味に関係なく、バイトストリームを暗号化できませんか?
NSDATAを使用することをお勧めします。したがって、必要なのは、NSStringからNSDATAオブジェクトを受け取ることだけで、そのバイトを要求し、それらをエンコードし、書き込みます。次。そのデータからnsstringをロード、デコード、および構築します。ここに有用な方法があります:
- (NSData *)dataUsingEncoding:(NSStringEncoding)encoding// for NSString
- (const void *)bytes// for NSData
- (void *)mutableBytes// if you prefer work with NSMutableData constructed from NSData with mutableCopy method
- (id)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding// to restore NSString back when decoding