3
Unicode UTFコンバーター
目標は、UTF FAQに記載されている公式のUnicodeエンコーディング間で完全に準拠したコンバーターを作成することです。これがユニコードに集中していることを考えると、関連するエンコーディング(おそらく、APLでプログラムしない限りUTF-8になる)の可能な限り最高のバイトカウントで回答を受け入れます。長い投稿をおa びしますが、その多くは公式仕様(pdf、セクション3.9 D90-D92)、またはWikipediaでもアクセスできるエンコードについて説明しています。 仕様書 選択した言語がいつでも要件を完全に満たせない場合は、指定されたルールの精神を維持するものに置き換えてください。例えば。すべての言語に組み込みの配列、関数などがあるわけではありません。 文字列ライブラリ/関数の使用、またはライブラリ/関数のエンコードはありません。このコードの目的は、ビット/バイト操作を使用してコンバーターを実装することです。ただし、文字列自体を文字またはバイト配列として使用することは許可されています。ああ、また、変換を実行するOS呼び出しもありません。 コンバーターは、エンコードされた入力文字列を表すバイト配列、および数値として表される「入力」および「出力」エンコーディングの3つのパラメーターを受け取る関数です。UTF-8, UTF-16, UTF-16BE, UTF-16LE, UTF-32, UTF-32BE, and UTF32LE0から6までの番号をこの順序で任意に割り当てます。数があるかどうかをチェックする必要はありません< 0か> 6、私たちはこれらのパラメータが正しいと仮定しますが。コンバーターは、目的の出力エンコーディングで有効なバイト配列を返します。 ヌル文字(U+0000)をストリングターミネーターとして使用します。この後は何でも構いません。入力配列のどこかにヌル文字があると想定しますので、境界チェックを行う必要はありません。 FAQのとおり、入力バイト配列が宣言されたエンコーディングに対して無効な場合、エラーを通知する必要があります。次のいずれかの方法でこれを行います:プログラムをクラッシュさせる、例外をスローする、nullを返す、または最初の4バイトがすべて0である配列を返す(U+0000すべてのエンコードで認識できるように)。 エンコーディング 公式の仕様に従う必要がありますが、ウィキペディアはエンコーディングの適切な(そして正しいと思う限り)説明を提供します。完全を期すためにここで要約します。UTF-16およびUTF-32には、エンディアンのバリエーションがあることに注意してください。 UTF-32、UTF-32LE、UTF-32BE 最も単純なエンコード、各コードポイントは、その数値に等しい4バイトでエンコードされます。LE / BEは、エンディアン(リトルエンディアン/ビッグエンディアン)を表します。 UTF-16、UTF-16LE、UTF-16BE からのコードポイントU+0000 - U+FFFFは、その数値に等しい2バイトでエンコードされます。より大きな値は、から予約された値であるサロゲートのペアを使用してエンコードされますU+D800 - U+DFFF。したがって、より大きいポイントをエンコードするにU+FFFFは、次のアルゴリズムを使用できます(Wikipediaから恥知らずにコピーされます)。 0x010000がコードポイントから差し引かれ、0..0x0FFFFFの範囲の20ビット数が残ります。 上位10ビット(0..0x03FFの範囲の数値)が0xD800に追加され、最初のコードユニットまたはリードサロゲートが与えられます。これは0xD800..0xDBFF [...]の範囲になります。 下位10ビット(0..0x03FFの範囲内)が0xDC00に追加され、2番目のコードユニットまたはトレイルサロゲートが与えられます。これは0xDC00..0xDFFF [...]の範囲になります。 UTF-8 からのコードポイントU+0000 - U+007Fは、その数値に等しい1バイトとしてエンコードされます。U+0080 - U+07FF彼らは次のようにエンコードされている110xxxxx 10xxxxxx、U+0800 - U+FFFFである1110xxxx 10xxxxxx 10xxxxxx、高い値です11110xxx 10xxxxxx 10xxxxxx 10xxxxxx。xさんは、コードポイントの数値からのビットです。 …