Zshで無効なUnicode文字を含む文字列を作成するには?

Zshで無効なUnicode文字を含む文字列を作成するには?

一部のテストでは、無効なUnicode文字を含む文字列が必要です。 Zshでこれらの文字列を作成するには?

答え1

UTF-8でエンコードされたUnicode文字に言及しているとします。

それはあなたが何を意味するかによって異なります。無効

invalid_byte_sequence=$'\x80\x81'

これはUTF-8エンコーディングでは無効なバイトシーケンスです(UTF-8エンコーディング文字の最初のバイトには常に2つの最も高いビットセットがあります)。ただし、シーケンスは文字の中央に表示されるため、他の無効なシーケンス(たとえば)にリンクすると、最終的に有効なシーケンスを形成する可能性があります$'\xe1'$'\xe1'あるいは、$'\xe1\x80'それ自体が無効であり、切り捨てられた文字として扱われる可能性があります。

other_invalid_byte_sequence=$'\xc2\xc2'

0xc2バイトは2バイト文字を開始し、0xc2はUTF-8文字の中央にはありません。したがって、有効なUTF-8テキストではシーケンスが見つかりません。 UTF-8エンコーディングにまったく表示されないバイトと$'\xc0'同じです。$'\xc1'

\uXXXXおよびシーケンスの場合、\UXXXXXXXX現在のロケールのエンコーディングがUTF-8であると仮定します。

non_character=$'\ufffe'

これは現在指定されている66のうちの1つです。非文字

not_valid_anymore=$'\U110000'

Unicodeは、最大0x10FFFFのコードポイントに制限されます。 UTF-8エンコーディングはもともと0x7FFFFFFFF(perl最大0xFFFFFFFFFFFFFFFFまでのバリアントもサポートされています)を含むように設計されていましたが、現在は通常そのエンコーディングに制限されています。

utf16_surrogate=$'\ud800'

コードポイント0xD800〜0xDFFFは、UTF16エンコーディング用に予約されたコードポイントです。したがって、これらのコードポイントのUTF-8エンコーディングは無効です。

現在のバージョンのUnicodeでは、残りのコードポイントのほとんどはまだ割り当てられていません。

unassigned=$'\u378'

最新バージョンのUnicodeには、指定された新しい文字が含まれています。たとえば、Unicode 8.0(2015年6月リリース)

関連情報