正規化(normalization)」のお話。2羽の「ペンギン」まず「ペンギン」という文字列を思い浮かべてみる。コードポイントで表すと以下のようになる。ペ:U+30DAン:U+30F3ギ:U+30AEン:U+30F3ところでペンギンの「ペ」と「ギ」は半濁点および濁点を含む。「ペ」と「ギ」をそれぞれ2つの要素に分解できる。character)」である。sequence)」と呼ぶ。これに対して「ペ:U+30DA」や「ギ:U+30AE」のような文字を「事前合成形(precomposed)」と呼ぶ。これを「重複符号化」と言う。文字集合に重複符号化があるというのは,はっきり言って「クソ仕様」である。作った連中がヘボいのではなく(いや,ヘボいのかもしれないが),いわゆる「歴史的経緯」というやつである4。これはこういうものだと諦めるしかない。情報処理を行う上では,この2羽の「ペンギン」が等価(equivalance)であることを示す手立てを考えなければならない。正規等価2羽の「ペンギン」が等価であることを示す一番簡単な方法は,文字列を事前合成形あるいは合成列のどちらかに統一(=正規化)してしまえばいい。equivalance)」と呼ぶ。文字列を正規化できる。コードで書いたほうがはやいか。}}実行結果はこんな感じ。交換可能であることがわかると思う。3羽目の「ペンギン」と互換等価さてここで3羽目の「ペンギン」に登場してもらおう。ヘ:U+FF8D゚:U+FF9Fン:U+FF9Dキ:U+FF77゙:U+FF9Eン:U+FF9Dこれはいわゆる「半角カナ」である。'ン'何も変わらないことが分かるだろう。Character)」として異なるコードポイントが割り当てられているため,このままでは3羽目の「ペンギン」が等価であることを示せない。このような場合は「ペンギン」と互換性のある別の文字列に正規化できるとよい。equivalance)」と呼ぶ。Decomposition)の2つがある。パッケージを使ってコードを書いてみる。正規化した「ペンギン」と等価であることがわかる。互換等価による正規化は応用範囲が広い。U+0029)に変換される。文字列検索の前に互換等価による正規化を行っておくことで処理がやりやすくなるというのはあるかもしれない。正規化した文字列を元に戻す方法はないので注意が必要である5。正規等価については注意すべき点がある。有名な「神」を例に挙げよう。違う文字になってしまった。ちなみに「神」から「神」へ正規化する方法はない。互換文字」と呼ばれるグループに属し,「神」とは異体字の関係にある。故に「神」を「神」に正規化してしまったのである。これは明らかに仕様ミスである。「神」と「神」のような異体字の関係は本来なら正規等価ではなく互換等価であるべきだからだ。これが実際の場面で問題になることは少ないと思われる。正規化を行うのは「2つの文字列が等価であるか?」を調べるための手段にすぎないからだ。ところが,普通でないことをする馬鹿がいるのである。相当に正規化するという恐ろしい仕様になっている6。それでは先ほどの例のように異体字を別の文字に変えられてしまうため困ったことになってしまう。互換文字を含むいくつかの文字を正規化の対象から外すという蛮行に出た。呼ばれる独自路線に走ってしまったわけだ。これにより様々な(特にマルチプラットフォームな)アプリケーションが多大なる迷惑を被ることになるが8,深くはツッコむまい。上述のような似非正規化は行わないらしい。よーし,うむうむ,よーし。正規化の4つの方式をまとめると以下のようになる。なるローカル仕様には対応していないので,必要なら自作する必要がある。文字列の等価属性を調べる際には是非参考にどうぞ。言語に関するブックマーク集はこちら。結合文字はひとつの基底文字に対して複数付加される場合もある。この場合に結合文字同士の順序は不定である。「文字エンコーディング」とは異なるものだ。規格にも「歴史的経緯」による重複符号化がある。異体字も一種の重複符号化と言える。これは日本語圏だけの問題ではなく,大抵の言語圏は似たような重複符号化の問題を抱えている。した仕様上の欠陥も含めて併呑してしてしまっているため,このような有様になっているわけだ。問題を先送りして更に酷いことになるという失敗例の典型ですな。」で言及しているので参考にどうぞ。古すぎて一部使えない記述もあるけど。パッケージをお勧めする。ファイルシステムはフォルダ・ファイルの名前を正規化するとかいうアホなことはしない。事前合成形も合成列も受け入れる。見かけ同じ名前のフォルダ・ファイルが複数できる可能性はあるが,それはそれ。ファイルシステムは名前の正規化なんてしてないはず。正規化のおかげで他プラットフォームはかなりの迷惑を被ることになる。経由した途端にフォルダ・ファイル名を書き換えられてしまうのだ。ユーザやアプリケーションは基本的に干渉できない。いうのが一般的らしい。この件はあくまでも正規化の問題であり文字エンコーディングの問題ではない。符号化文字集合と文字エンコーディングと正規化の区別もつかない馬鹿ばっかりだからこのような愚行を犯してしまったのだろう。脆弱性問題で激怒している。コードを「追跡コード」としてブロックする場合があります。電子メールも利用できます。電子メールを利用する際の公開鍵はプロフィールから取得できます。Baldanders.info.。