画面に見える形状とコードポイントの配列は異なる場合があります

最初の例では、コードポイント U+00E9 一つの é と、U+0065(e)の後に U+0301(結合アクセント)を置いた二つのコードポイントを比較します。見え方はフォントや描画環境によって変わるため、元の並びを明示します。Unicode では、この二つの表現は正準等価です。

Unicode UAX #15: 正準的同等性と正規化

U+00E9のUTF-8 2バイトとU+0065 U+0301の3バイトを比較した図式
Moyoutilが直接製作した比較図です。以下の表の実際の実行結果に基づいて作成し、画面キャプチャではありません。

実際のツール関数で確認した文字数・バイト・Base64

2026年10月5日に、プロジェクトの countText、base64、digest 関数で確認しました。文字数の列は Moyoutil が数えるコードポイント数です。人が一文字と認識する単位の数とは限りません。ツールは入力を自動的に NFC に変換しません。

正規化前の入力の直接実行結果
コードポイント文字数UTF-8 bytesBase64
U+00E912w6k=
U+0065 U+030123ZcyB
U+AC00136rCA
U+1100 U+1161264YSA4YWh

ハングルの例は、合成済みの音節と結合用の字母(jamo)の並びを比較しています。結果は表に示した入力の測定値であり、すべてのハングルやアクセント付き文字に同じバイト数が当てはまるわけではありません。TextEncoder は UTF-8 を使用します。

WHATWG Encoding: TextEncoder

ハッシュは画面の外観ではなく入力バイトを比較します

上記2つの表現のUTF-8バイトをMoyoutil SHA-256関数に渡すと、以下の結果が得られます。このケースでは異なる値です。テキストモードには自動正規化がなく、ファイルモードはファイルバイトをそのまま使用します。テキストとして貼り付けた値のハッシュが元のファイル全体のハッシュと同じであると仮定しないでください。

U+00E9
4a99557e4033c3539de2eb65472017cad5f9557f7a0625a09f1c3f6e2ba69c4c

U+0065 U+0301
bf12767b0f2a56b2190075bae8169f656e3ce8d6357d4aff184bc6c7ea48f9f6

文字数ツールに各表現を別々に入力してバイト数を確認し、SHAハッシュツールのテキストモードで同じ入力のSHA-256を計算します。同じ外観をキーボードに戻すと、元の配列が再現されない可能性があるため、以下のコードのエスケープ表現で原文を生成する方法も使用できます。

NFC比較を再現しますが、原文は保存してください

JavaScript の normalize は NFC、NFD、NFKC、NFKD をサポートします。例では、二つの é の表現をそれぞれ NFC に変換してから比較します。NFC は正準分解の後、可能な箇所に正準合成を適用します。変換後に一致しても、元の並びが同一だったという意味ではありません。

const a = "\u00E9";
const b = "e\u0301";
console.log(a === b); // false
console.log(a.normalize("NFC") === b.normalize("NFC")); // true
console.log(new TextEncoder().encode(a).length); // 2
console.log(new TextEncoder().encode(b).length); // 3

ECMAScript: String.prototype.normalize

NFKCは互換性の違いも整理し、この例の円の中の数字①を1に置き換えます。区別が重要な資料に無条件に適用すると、原文が変わることがあります。正規化は大文字と小文字の変換や空白の除去とは別の作業です。

Unicode UAX #15: 正規化形式との互換性の違い

バイト制限とチェックサムエラーを調べる順序

  1. 原稿をアーカイブしてテキストを比較するかファイル全体を比較するかを区別します。
  2. UTF-8バイト数を確認し、前後のスペースと改行を別々にチェックします。
  3. 受信システムが正規化形式を指定していることを確認してください。ルールがなければ、ランダムに原文を変更しません。
  4. 正規化が合意されたテキスト比較である場合は、コピーに同じ形式を適用してからバイトとハッシュを再確認します。
  5. 元のファイル整合性チェックでは、ファイルを編集または正規化することなく、提供されたチェックサムと比較します。

現在、Moyoutilの文字数・Base64・SHAツールは正規化エディタではありません。正規化を自動実行するボタンは提供されません。この記事のコードは技術再現性であり、外部サービスの提出規則に代わるものではありません。

よくある質問

NFCに置き換えると、すべての文字の容量が減りますか?

いいえ。この記事の2つの例では、バイト数が減りますが、すべての入力の容量削減ルールではありません。変換後の実際のバイト数を確認してください。

同じように見えるパスワードも自動的に正規化する必要がありますか?

この記事では、認証システムのパスワード処理規則を定めていません。そのシステムの指定された規則なしで原文をランダムに変更しないでください。