2017-04-22 11 views
0

UTF-16エンコーディングで記​​述されたバイナリモードでファイルを読み込み、UNICODEコードポイントに変換する必要があります。コードポイントをU + 0000..U + FFFF間隔から正常にマップするのに問題はありませんでした。問題は、U + 10000からU + 10FFFFまでです。UTF-16エンコーディングは、2つの部分を使用してコードポイントを形成します。Cを使用してUTF-16ファイルからUnicodeコードポイントをマップする方法

例:このロケットは、UNICODEコードポイント:U + 1F680を形成する0xD83D 0xDE80としてUTF-16でエンコードされています。

UTF-16エンコーディングは、間隔U + 0000からU + FFFFまでのUNICODEコードポイントとまったく同じであるため、UTF-16の読み込みをUNICODEコードポイントに変換するコードを記述しました。私のプログラムは最初の部分(D83D)を区間U + 0000からU + FFFFまでの何かであると理解しているので、問題はU + 10000と前方で発生します。

このエラーを回避するにはどうすればよいですか? UNICODEコードポイントを正常に形成するためには、読んでいる部分にもう1つの部分が必要であることを知るために、自分のコードを実行することができます。

ありがとうございます!

+1

これは偽である:「UTF-16エンコーディング間隔U + 0000からU +のUNICODEコードポイントとまったく同じ数でありますFFFF "となる。 UTF-16 0xD800〜0xDFFFは、Unicode U + 10000を表す[surrogates](https://en.wikipedia.org/wiki/UTF-16#U.2BD800_to_U.2BDFFF)です。 –

答えて

2

あなたが欠けている検索語句は「サロゲートペア」です。次のコードは、エラーチェックまたは境界チェックを行わないことに注意してください。

int next_codepoint(uint16_t *text) { 
    int c1 = text[0]; 
    if (c >= 0xd800 && c < 0xdc00) { 
     int c2 = text[1]; 
     return ((c1 & 0x3ff) << 10) + (c2 & 0x3ff) + 0x1000; 
    } 
    return c1; 
} 

これは、UTF-16でのUnicodeのWebサイトから無償で入手できますUnicode仕様のほか、Wikipediaの記事に記載されています。 iconvのようなコーデック変換に利用できるライブラリも数多くあります。 UTF-16をUTF-32に変換しようとしています。