9

説明できない奇妙な問題があります。アクセント付きの文字列を「é」として操作しようとしています。この文字列は、入力ファイル タイプの画像の名前から取得されます。

理解できないのは、アクセント付きの文字を解析するときに文字列が 2 つの文字に分割される理由です。理解を深めるための例を次に示します。

Myはこの&éのように 2 つの文字に分割されます。é

"é".length
=> 2

utf8が関係している可能性はありますか?

私は本当に何も理解していません!

4

2 に答える 2

11

それらは、結合ダイアクリティカル マークと呼ばれます。それらは Unicode の「断片」です...任意の文字に「連鎖」できるいくつかの組み合わせ可能な分音記号です。その場合の文字列の長さは明らかに 2 です ( と があるためeです'。 のような構成済みの文字àéèìòùは互換性のために残されていますが、現在は任意の文字にアクセントを付けることができます :-) 明らかに 99% のプログラマーはそれを知りません。 、そしてプログラムの 99.9% がそれを非常にひどくサポートしています。どこかで攻撃ベクトルとして使用できると確信しています(しかし、私は妄想的ではありません:-) )

2009 年の Skeet でさえ、それらがどのように機能するか確信が持てなかったことを付け加えておきます

ほら、結合文字が基本文字の前か後か思い出せなかった

:-) :-)

于 2013-09-02T17:26:41.273 に答える
8

UTF-8 の代わりに、関連する分音記号を組み合わせる可能性が高くなります。

>>> "e\u0301"
"é"
>>> "e\u0301".length
2

Javascript の文字列は通常 UTF-16 としてエンコードされるため、1 つのコード単位に 1 つの「é」(U+00e9) 全体を含めることができます。


ただし、BMP の外側の文字 (U+FFFF を超えるコード ポイントを持つ文字) は、2 つの UTF-16 コード単位にエンコードされるため、2 を返します。

>>> "".length
2
于 2013-09-02T17:29:32.797 に答える