はじめに
文字コード難しすぎ問題。
とりあえずUnicode最高!utf8最高!って言っとけばいいんでしょ状態なので少し調べてみた。
http://j-lyric.net/artist/a0006e0/l00abdb.html
なぜ調べたのか
もともとは
「JSでJIS X 0213コードの第2水準漢字(例外あり)までのバリデーションを実装したい(実はもっとちゃんとした質問だったけど割愛)」
という質問をもらっていたんだけど、質問の意図は何だろうとか、よくある文字コード問題ってなんだっけということを考えてみた。
JIS X 0213コード表(全コード)
Wikipediaによれば、
JIS X 0208を拡張した規格で、JIS X 0208が規定する6879字の図形文字の集合に対して、日本語の文字コードで運用する必要性の高い4354字が追加され、計1万1233字の図形文字を規定する。(中略)JIS X 0213はJIS X 0208を包含し更に第三・第四水準漢字などを加えた上位集合である。
ということらしい。
まぁほぼ意味不明。
文字コードの歴史
そもそも文字コードって何?おいしいの?って言う人向けに文字コードをマスターするには歴史から知るといい。
今でこそ世界中の文字を表現できるUnicodeでアプリの国際化が実現できているけど、それまでは混沌を極めたのが文字コードの歴史だ。
文字コード、文字コードというけど文脈によって符号化文字集合のことだったり、文字符号化方式のことだったりするので頭のなかで今はどっちの意味で話しているのかを切り分けて考えられるようになると理解が進むかも。
買ったことないけど以下の書籍は身の回りでおすすめしている人が多いので掲載しておく。
よくある文字コード問題
アプリ側の文字コードとDB側の文字コードは違うので(詳しくはよくわかってない)、古い時代のMySQLを使っていたりすると4バイト文字(サロゲートペア文字)が悪さをしてしまったりする。
対処法としてはMySQLのcharsetを utf8mb4
にすることで対応できる(MySQL5.5以降)。
charsetがutf8
の場合、寿司の絵文字とビールの絵文字が同一文字と見なされてしまうことを「寿司ビール問題」とかって言う。
もしどうしてもサロゲートペア文字をフォームではじきたいという場合には以下のような実装をする必要がある。
まとめ
実際にこの問題に出くわしたことはないし、これで完璧だと言うつもりはないけど聞かれたら「これが怪しい」とか「仮説としてこう考えるとこうなんじゃね?」という勘どころを養うのは大事だと感じた。
質問する側はその質問の意図がわかってないことが多いので「質問の意図はなんだろう?」という自問自答を繰り返しながら仮説検証していきたい。