17

トルコ語の文字「ÇçĞğİıÖöŞşÜü」は、すべて定義されているように見えますが、utf-8 エンコーディングでは正しく処理されません。それらの文字コードはすべて 65533 (置換文字、おそらくエラー表示用) であり、選択したフォントに応じて疑問符またはボックスが表示されます。場合によっては、0/null が charcode として返されます。インターネット上には、それらの utf-8 定義を提供するツールがたくさんありますが、ツールが定義済みの (実際の/国際的な) レジストリを使用するのか、既知のルールと計算で定義を動的に作成するのかはわかりません。それらのフォントは明確に定義されており、コードポイントを手動で入力しても問題なく表示されます。これは、utf-8 で定義されていることを証明しています。しかし一方で、それらは ajax リクエスト/レスポンスなどのエンコーディングや変換では処理されません。

したがって、基本的な質問は「CHAR のコードポイントを定義するにはどうすればよいか」です。誤解を避けるために、質問は次のように調整することができます。「Ç」のエンコードデータをこのように用意したとします -> キャラクター:Ç キャラクター名:CEDILLA 付きラテン大文字 C 16 進コードポイント:00C7 10 進コードポイント:199 16 進 UTF-8 バイト:C387 ......この情報を標準の utf-8 文字として保存する場所/方法は? どのように配布/公開(他の人が使用できるようにする)できますか? 誰か/財団 (unicode/utf-8 コンソーシアムなど) による確認が必要ですか? エラーが既に登録されているが正しく機能していない場合、エラーを検出/修正するにはどうすればよいですか? custom-utf8 構成を使用できますか? はいの場合、どのように?

注 : 誤用の問題ではないため、ここではコード スニペットは必要ありません。

4

1 に答える 1

23

あなたが言及した文字はUnicodeに存在します。16 進数の文字コードと、UTF-8 でのエンコード方法を次に示します。

      Ç     ç     Ğ     ğ     İ     ı     Ö     ö     Ş     ş     Ü     ü
Code: 00c7  00e7  011e  011f  0130  0131  00d6  00f6  015e  015f  00dc  00fc
UTF8: c3 87 c3 a7 c4 9e c4 9f c4 b0 c4 b1 c3 96 c3 b6 c5 9e c5 9f c3 9c c3 bc

これは、たとえばバイト 0xc4 0x9e をファイルに書き込むと、文字«を書き込んだことになり、UTF-8 を理解するソフトウェア ツールはそれを«として読み戻さなければならないことを意味します。

更新:トルコ語で正しいアルファベット順と大文字と小文字の変換を行うには、他の自然言語と同様に、ロケールを理解するライブラリを使用する必要があります。たとえば、Java では次のようになります。

Locale tr = new Locale("TR","tr");     //    Turkish locale
print("ÇçĞğİıÖöŞşÜü".toUpperCase(tr)); //    ÇÇĞĞİIÖÖŞŞÜÜ
print("ÇçĞğİıÖöŞşÜü".toLowerCase(tr)); //    ççğğiıööşşüü

大文字の i が İ になり、小文字の I が ı になることに注意してください。どのプログラミング言語を使用しているかはわかりませんが、その標準ライブラリも確かにロケールをサポートしています。

Unicode は、各文字のコード ポイントと特定のプロパティ (たとえば、数字または文字の場合、文字が大文字、小文字、またはタイトルケースの場合)、および Unicode テキストを処理するための特定の一般的なアルゴリズム (たとえば、どのように混合するか) を定義します。右から左へのテキストと左から右へのテキスト)。アルファベット順と正しい大文字と小文字の変換は、Unicode とは関係なく、フィンランドの Institute of Languages of Finland、スペインのReal Academia Españolaなどの国家標準化団体によって定義されています。

更新 2:

((ch&0x20)==ch)小文字のテストは、トルコ語だけでなく、世界中のほとんどの言語で壊れています。あなたが言及した大文字を小文字に変換するためのアルゴリズムもそうです。また、文字であることのテストも正しくありません。多くの言語では、Z はアルファベットの最後の文字ではありません。テキストを正しく扱うには、何をしているのかを知っている人によって書かれたライブラリ関数を使用する必要があります。

ユニコードは普遍的であると考えられています。国別および言語固有のエンコーディングのバリエーションを作成することが、Unicode が解決しようとしている混乱へと私たちを導きます。残念ながら、文字の順序付けに関する普遍的な基準はありません。たとえば、英語では a = ä < z ですが、スウェーデン語では a < z < ä です。ドイツ語では、Ü はある基準では U と同等であり、別の基準では UE と同等です。フィンランド語では Ü = Y です。すべての言語で順序が正しくなるようにコード ポイントを順序付ける方法はありません。

于 2013-02-04T23:47:37.920 に答える