UTF-8は、Unicodeに対応していないコードを簡単に混同しないように、可変幅フォーマットでUnicodeコードポイントをエンコードする比較的単純な方法です。
UTF-8の概要
- 通常、1から0x7Fの範囲のバイトが有効です。
- ビットパターンの
10XX XXXX
あるバイトは継続バイトと見なされ、最下位6ビットがコードポイントの一部のエンコードに使用されます。これらは、先行するバイトで予期されていない限り、表示されないようにする必要があります。 - パターンを持つバイトは、
110X XXXX
その後に1つの継続バイトを期待します - パターンのあるバイトは、
1110 XXXX
その後2つの継続バイトを予期します - パターンのあるバイトは、
1111 0XXX
その後に3つの継続バイトを期待します - 他のすべてのバイトは無効であり、UTF-8ストリームのどこにも表示されるべきではありません。5、6、および7バイトのクラスターは理論的には可能ですが、この課題では許可されません。
長すぎるエンコーディング
UTF-8では、コードポイントを最小バイト数で表す必要もあります。より少ないバイトで表現できるバイトシーケンスは無効です。変更されたUTF-8は、これに1つの例外を追加し、ヌル文字(U + 0000)をC0 80
(16進表記)として表す必要があります)代わりに、ストリーム内のどこかにヌルバイトを表示できません。(これにより、ヌル終了文字列と互換性があります)
チャレンジ
バイトの文字列が与えられたときに、その文字列が有効なModified UTF-8を表すかどうかを判断し、有効な場合は真の値を、それ以外の場合は偽の値を返すプログラムを作成します。長すぎるエンコーディングとnullバイトをチェックする必要があることに注意してください(これはModified UTF-8であるため)。UTF-8値をデコードする必要はありません。
例
41 42 43 ==> yes (all bytes are in the 0-0x7F range)
00 01 02 ==> no (there is a null byte in the stream)
80 7F 41 ==> no (there is a continuation byte without a starter byte)
D9 84 10 ==> yes (the correct number of continuation bytes follow a starter byte)
F0 81 82 41 ==> no (there are not enough continuation bytes after F0)
EF 8A A7 91 ==> no (too many continuation bytes)
E1 E1 01 ==> no (starter byte where a continuation byte is expected)
E0 80 87 ==> no (overlong encoding)
41 C0 80 ==> yes (null byte encoded with the only legal overlong encoding)
F8 42 43 ==> no (invalid byte 'F8')
ルール
- 標準のルールと抜け穴が適用されます
- 符号なしバイト範囲(0〜255)のすべての値を読み取ることができる限り、入出力は任意の便利な形式にすることができます。
- nullで終了する文字列ではなく、配列またはファイルを使用する必要がある場合があります。nullバイトを読み取ることができる必要があります。
- 最短のコードが勝ちます!
- ビルトインを使用してUTF-8をデコードしても、ここに記載されている要件に準拠しているとは限りません。それを回避し、特別なケースを作成する必要があるかもしれません。
編集:UTF-8をデコードするビルトインを使用しないことのボーナスを追加しました
EDIT2:Rustの回答のみが適格であり、定義するのが面倒なので、ボーナスを削除しました。