JavaScript で暗号化メソッドを記述しているときに、文字列がどの文字エンコードを使用しているのか、またその理由は何か疑問に思いました。
JavaScript の文字エンコードは何が決定するのでしょうか? 標準ですか? ブラウザによって決まりますか? HTTP リクエストのヘッダーによって決まりますか?<META>
それを囲む HTML のタグで決まりますか? ページにデータを供給するサーバーによって決まりますか?
私の経験的なテスト(さまざまな設定を変更し、charCodeAt
十分に奇妙な文字を使用して、値がどのエンコーディングと一致するかを確認)によると、常にUTF-8またはUTF-16であるように見えますが、確信はありません。なぜ。
必死にグーグルで検索してみましたが、この単純な質問に対する決定的な答えは見つけられませんでした。
ベストアンサー1
E262のセクション8.4:
String 型は、ゼロ個以上の 16 ビット符号なし整数値 (「要素」) の有限順序シーケンスの集合です。String 型は、通常、実行中の ECMAScript プログラムでテキスト データを表すために使用されます。この場合、String 内の各要素はコード ユニット値として扱われます (第 6 項を参照)。各要素は、シーケンス内の位置を占めていると見なされます。これらの位置は、負でない整数でインデックス付けされます。最初の要素 (ある場合) は位置 0、次の要素 (ある場合) は位置 1、というように続きます。String の長さは、その中の要素 (つまり、16 ビット値) の数です。空の String の長さは 0 であるため、要素は含まれません。
文字列に実際のテキスト データが含まれている場合、各要素は単一の UTF-16 コード単位と見なされます。これが文字列の実際の保存形式であるかどうかに関係なく、文字列内の文字は、UTF-16 を使用して表現されているかのように、最初のコード単位要素の位置によって番号が付けられます。文字列に対するすべての操作 (特に明記されている場合を除き) では、文字列は区別のない 16 ビットの符号なし整数のシーケンスとして扱われます。結果の文字列が正規化された形式になることは保証されず、言語に依存する結果になることも保証されません。
この言い回しはちょっと曖昧です。重要なことはすべて、各文字が UTF-16 文字であるかのように文字列を扱うが、同時に、すべてが有効であることを保証するものは何もないということを意味しているようです。
明確に言えば、意図文字列はUTF-16コードポイントで構成されているということです。ES2015「文字列値」の定義には次の注記が含まれています。
文字列値は、文字列型のメンバーです。シーケンス内の各整数値は通常、UTF-16 テキストの 16 ビット単位を表します。ただし、ECMAScript では、値が 16 ビットの符号なし整数でなければならないことを除き、値に制約や要件はありません。
したがって、正しい Unicode 文字として機能しない値が含まれている場合でも、文字列は文字列のままです。