javaUnicodeの正規化については以下で書きました。Unicodeの正規化が必要になるのかでは「同じ」とはなんなのか合成と分解では具体的に見てみましょう分解結果はどう定義されているのか正規化実装ソースなぜUnicodeの正規化が必要になるのか端的にいうと、Unicodeの中に同じ意味を持つ文字がある、あるいは同じ意味を持つ文字列が構成できてしまうからではないでしょうか。僕たちに馴染みの深いほげという文字列も、Unicodeでは以下のように表現できてしまいます。前提として、「ほげ」という文字列をUnicodeで表記しようとするとき、U+307B(ほ)とU+3052(げ)の2つのコードポイント列での表現が可能です。別解として、U+307B(ほ)とU+3051(け)、U+3099(濁点)の組み合わせでも表現できます。print("\u307B\u3051\u3099")ほげでは「同じ」とはなんなのかここで「同じ」、つまり、等価性をどう定義するのかという問題が出てきます。Unicode標準では、文字の「等しさ」について2つの基準を定めています。Equivalenceにあります。subtypes.以下、ざっくりとChatGPTにまとめてもらいました。異なるバイトシーケンスが同じ文字として認識される。異なるバイトシーケンスが同じような文字として認識される。表示スタイルや書体などの視覚的な差異がある場合がある。文字の基本的な形を維持しながら、異なるエンコード方法を同一視する。異なるスタイルや書体の文字を、本質的に同じ文字として扱う。キリル文字の「A」とラテン文字の「A」は見た目が同じだが、異なるコードポイントを持つ。正準等価性では、これらは別の文字として扱われる。「fi」(合字)と「fi」(2つの別々の文字)は、視覚的に似ているが、異なるコードポイントを持つ。互換等価性により、これらは等価とみなされる。検索、ソート、テキスト処理での一貫性を保つため。異なるスタイルや書体の文字を統一的に扱うため、特に文書処理や表示の際に重要。同じ文字が異なる方法でエンコードされることを許容し、それらを等価とみなす。視覚的に似ているが異なるコードポイントを持つ文字を等価とみなすことで、柔軟なテキスト処理を可能にする。正準等価性は見た目では区別できない本質的な意味の同一性を表現している一方、互換等価性は見た目が違っていても同一とみなす、緩い同一性を表現しているようです。先ほどの「ほげ」の例では、「げ」がU+3052(げ)、および、U+3051(け)、U+3099(濁点)の組み合わせの2パターンで表現されました。「合成」した結果を正規化の結果とするのか、「分解」した結果を結果とするのかの2つの考え方があるということです。先ほどの等価性と組み合わせて、全部で4パターンの正規化パターンが存在します。互換等価によって分解された後、正準等価によって合成する正規化方法では具体的に見てみましょう抽象論に終始してもなかなか理解できないので、基本的な文字列をそれぞれ正規化してみましょう。末尾にJavaでのソースも示します。末尾が「D」(分解)の正規化では、もともと1つのコードポイントだった文字が、複数のコードポイントに分解されたりしていることがわかります。fiやTEL.などは、正準等価だと1コードポイントのままですが、互換等価だと複数コードポイントに分解され、その表現も大きく変わっていますね。u795e分解結果はどう定義されているのか正準等価での正規化は、多くの場合「合字」を分解するか、結合するかによって行われているため、ある程度その正規化結果は想像しやすいです1。一方で互換等価の正規化は、その等価性が「緩い」こともあり、なかなか予想しづらいものになっています。この定義はどこで行われるのでしょうか。(UCD)にあります。DATABASEがその解説。UCDはUnicodeの文字に関するデータベースです。Unicodeの文字に関する情報が、コードポイントごとに記載されています。その中には、互換等価性に関する情報も含まれています。「TEL」の例であれば、U+2121のコードポイントに対して、以下のような情報が記載されています。SYMBOL;;;;UCDは;区切りのCSV形式で記載されています。<compat>というフィールドがあり、これが互換等価性を表しています。このフィールドには、互換等価性を持つコードポイントが列挙されています。004Cがそれにあたります。0301が示されています。ACUTE;;;00E1;分解結果は5つ目のフィールドで表現されており、<hoge>というようなタグがある場合は互換等価性による分解結果、ない場合は正準等価性による分解結果を表現しています。Mappingをご参照ください。}}実際には、正準等価であってもその分解が想像しづらいものになるケースはあります。ExtensionのユニットテストでCoverageを取得する「上流から下流まで生成AIが変革するシステム開発」を読んだ「その仕事、AIエージェントがやっておきました。(1)はてなブログをはじめよう!kiririmodeさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。