1

現在、Unicode 文字を処理する iOS アプリを使用していますが、Unicode 16 進値 (および int 値も) を文字に変換する際に問題があるようです。

たとえば、Unicode 値が c491 の文字 'đ' を取得したいのですが、次のコードの後に​​:

NSString *str = [NSString stringWithUTF8String:"\uc491"];

str の値は 'đ' ではなく '쓉' (韓国語) です。

私も使用しました:

int c = 50321; // 50321 is int value of 'đ'
NSString *str = [NSString stringWithCharacters: (unichar *)&c length:1];

しかし、上記の 2 つのコードの結果は同じです。

ここで何が問題なのか理解できません。助けてください!

4

1 に答える 1

3

短い答え

を指定đするには、次の方法で指定できます (未テスト)。

@"đ"
@"\u0111"
@"\U00000111"
[NSString stringWithUTF8String: "\u0111"]
[NSString stringWithUTF8String: "\xc4\x91"]

最後の 2 行では、Objective-C 文字列オブジェクト リテラル コンストラクトの代わりに C 文字列リテラルを使用していることに注意してください@"..."

簡単に説明すると、\u0111は の Unicode エスケープ シーケンスですđ。ここU+0111で、 は文字のコード ポイントですđ

最後の例は、C 文字列リテラルでđ(つまりc4 91) の UTF-8 エンコーディングを指定し、UTF-8 エンコーディングのバイトを適切な文字に変換する方法を示しています。

上記の例は、この回答このブログ投稿から改作されています。このブログでは、Unicode のBasic Multilingual Plane (Plane 0)を超えた文字のトリッキーな状況についても取り上げています。

Unicode エスケープ シーケンス (C99 の汎用文字名)

このブログによると1 :

Unicode エスケープ シーケンスは、C99 の TC2 修正で C 言語に追加され、Mac OS X 10.5 で Objective-C 言語 (NSString リテラル用) に追加されました。

C99 TC2 ドラフトの 65 ページには、 or\unnnn\Unnnnnnnn「ISO/IEC 10646 標準で定義された短い識別子」であることが示されています。ご了承ください:nnnnnnnnnnnn

$ユニバーサル文字名は、短い識別子が 0024 ( )、0040 ( @)、または 0060 ( )以外の 00A0 未満である文字`、および D800 から DFFF までの範囲の文字を指定してはなりません。

文字セットと文字エンコーディング

U+0111コードポイントとUTF-8エンコーディングc4 91(文字をバイトとして表現)を混同しているようです。UTF-8 エンコーディングは、Unicode 文字セットのエンコーディングの 1 つです。コード ポイントは、文字セット内の文字に割り当てられた番号です。このウィキペディアの記事では、意味の違いが非常に明確に説明されています。

コード化文字セット(CCS) は、コード ポイントと呼ばれる多数の (通常は負でない) 整数値を使用して、文字のレパートリーを表す方法を指定します。[...]

文字エンコード形式(CEF) は、コード化された文字セットの整数コードを、固定数のビットを使用してバイナリ形式で数値を表すシステムでの格納を容易にする、サイズが制限された整数コード値のセットへの変換を指定します [...]

UTF-16 や UTF-32 など、ディスク上の文字の異なるバイト表現を提供する他のエンコーディングがありますが、UTF-8、UTF-16、および UTF-32 はすべて Unicode 文字セットのエンコーディングであるため、コード同じ文字のポイントは、3 つのエンコーディングすべてで同じです。

脚注

1 : ブログは正しいと思いますが、この点について誰かが Apple の公式ドキュメントを見つけることができれば、より良いでしょう。

于 2013-02-28T09:29:24.523 に答える