4

私はUnicodeに関するSOに関するいくつかの質問を読んでいましたが、次のように、完全には理解していないコメントがいくつかありました。

Dean Harding:UTF-8は可変長エンコーディングであり、固定長エンコーディングよりも処理が複雑です。また、Gumboの回答に関する私のコメントも参照してください。基本的に、結合文字はすべてのエンコーディング(UTF-8、UTF-16、およびUTF-32)に存在し、特別な処理が必要です。文字の結合に使用するのと同じ特別な処理を使用して、UTF-16のサロゲートペアも処理できるため、ほとんどの場合、サロゲートを無視して、UTF-16を固定エンコーディングのように扱うことができます。

私は最後の部分(「ほとんどの部分」)で少し混乱しました。UTF-16が固定16ビットエンコーディングとして扱われる場合、これによりどのような問題が発生する可能性がありますか?BMPの外にキャラクターがいる可能性は何ですか?ある場合、2バイト文字を想定した場合、これによりどのような問題が発生する可能性がありますか?

サロゲートに関するウィキペディアの情報を読みましたが、それは私にとって物事を明確にするものではありませんでした!

編集:私が本当に意味しているのは、「偽物のように見えるのに、なぜUTF-16を固定エンコーディングとして扱うことを提案するのでしょうか?」ということだと思います。

Edit2:

「 UTF-8よりもUTF-16を好む理由はありますか? 」で別のコメントを見つけました。これは、これをもう少しよく説明していると思います。

Andrew Russell:パフォーマンスについて:UTF-8はUTF-16よりもデコードがはるかに困難です。UTF-16では、文字は基本多言語面文字(2バイト)または代理ペア(4バイト)のいずれかです。UTF-8文字は、1〜4バイトの範囲で指定できます

これは、UTF-16には3バイトの文字がないため、16ビットを想定することで、1バイトをオフにして「完全に失敗」することはないということを示しています。しかし、これがUTF-8がシングルバイト文字であると仮定することと何ら違うとはまだ確信していません!

4

4 に答える 4

2

私が本当に言いたいのは、「UTF-16 を固定エンコーディングとして扱おうと提案するのはなぜでしょうか?」ということです。

2 つの言葉:下位互換性。

Unicode は当初、固定幅の 16 ビット エンコーディング (UCS-2) を使用することを目的としていました。これが、Unicode の初期の採用者 (Java を使用する Sun や Windows NT を使用する Microsoft など) が 16 ビット文字タイプを使用した理由です。65,536 文字ではすべての人にとって十分ではないことが判明したとき、この 16 ビット文字システムが 16 の新しい「プレーン」を表現できるようにするために、UTF-16 が開発されました。

これは、文字が固定幅ではなくなったことを意味し、「UTF-16 はほぼ固定幅だから大丈夫」という合理化が行われました。

しかし、これが UTF-8 が 1 バイト文字であると想定することと何か違うとはまだ確信が持てません!

厳密に言えば、違いはありません。のようなものに対しては、間違った結果が得られます"\uD801\uDC00".lower()

ただし、UTF-16 が固定幅であると仮定すると、UTF-8 が固定幅であると仮定するよりも破損する可能性が低くなります。非 ASCII 文字は英語以外の言語では非常に一般的ですが、非 BMP 文字は非常にまれです。

文字の結合に使用するのと同じ特別な処理を使用して、UTF-16 のサロゲート ペアも処理できます。

彼が何について話しているのかわかりません。構成文字が個別のアイデンティティを持つ組み合わせシーケンスは、ペアでのみ意味を持つ代理文字のようなものではありません。

特に、結合シーケンス内の文字は、一度に 1 文字ずつ異なるエンコーディング形式に変換できます。

>>> 'a'.encode('UTF-8') + '\u0301'.encode('UTF-8')
b'a\xcc\x81'

しかし、サロゲートではありません:

>>> '\uD801'.encode('UTF-8') + '\uDC00'.encode('UTF-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'utf-8' codec can't encode character '\ud801' in position 0: surrogates not allowed
于 2011-02-22T13:56:29.080 に答える
1

UTF-16 は可変長エンコーディングです。古い UCS-2 はそうではありません。可変長エンコーディングを固定 (一定長) のように扱うと、「16 ビット数値の数」を「文字数」を意味するために使用するたびにエラーが発生するリスクがあります。 16 ビット量。

于 2011-02-21T13:32:46.043 に答える