Language
string: 見た目が同じ Unicode 文字列でも === が異なる
合成済み文字と結合文字列は表示が同じでも別のコードポイント列です。
SourceunicodeNormalization.ts
Node.js 22
export function normalizeNfc(value: string): string {
return value.normalize("NFC");
}TestunicodeNormalization.test.ts
Node.js 22
import assert from "node:assert/strict";
import test from "node:test";
import { normalizeNfc } from "../../src/string/unicodeNormalization.js";
test("正規化前は異なりNFC後は同じ文字列になる", () => {
const composed: string = "é";
const decomposed: string = "é";
assert.equal(composed === decomposed, false);
assert.equal(normalizeNfc(composed) === normalizeNfc(decomposed), true);
});01Assertion
このテストで確認できること
- 合成済みと結合文字列は === で異なる
- NFC 正規化後は同じ文字列になる
外部入力を識別子として比較・保存する場合は、必要な境界で Unicode 正規化方針を定めます。
OBSERVED RESULT
expected: "é" === "é" → false
actual: false
expected: NFC normalized equality → true