文字コードに悩む
どこまで行っても、文字コードとやらはプログラミングやシステムの設定において本当にクセモノで、悩みの種。
最近だと、PerlでMySQLデータベースを呼び出すときに、ある時は文字化けがおき、別の時は文字化けしないという問題が起きた。PerlでのUTFフラグとMySQLの文字コードの扱い方やオプションを理解しないといけない(MySQL4.1からはクライアント側とサーバ側の文字コードを指定できるようになって、で、しかも自動で行なってくれるという便利な機能が災いする。よって、この動作を無効にするオプションがある。)。
そもそもUnicodeとは何か?UTF-8とは?という基本的なところも知っていないと、はっきり言って頭の中は大混乱。この際だからUnicodeを整理がてらまとめておこうっと…
そもそものUnicode≒UCS-2(256x256=65,536文字)
これでは結局すべての文字を統一コードで収めることはできなかった。ので、UCS-4が考案される。
UCS-4(256x256x256x256=4,294,967,296文字)
でも流石にこんだけの広さはいらないだろう?4バイトで1文字というのは勿体ないし、UCS-2でも2バイトで英文字でも1文字というのは英語圏の人には不便。ということで、可変長のUTF-8が考案された。UTF-8の8は基本8ビットで表現できるから。UCSを表現するための符号化仕様。
UTF-8(ASCII文字は1バイト、その他は2~6バイト)
あとUTF-16やUTF-32もあるようだけど、どんどん混乱するのでやめます…[:悲しい:](多分に漏れず、上記は間違っている可能性がありますので、ご注意)
参考
-UCS-2とUTF-8
-小形克宏の「文字の海、ビットの舟」
さらに、今悩み中なのがLinuxからSQL Serverをつつく方策。
unixODBC+FreeTDS+DBD::ODBCという方法で接続自体はうまくいったが、ここでも文字コードの問題発生。Perlで収めた住所データの中で全角「-」だけが「?」になってしまう。こっちが「?」と言いたい。色々あさっているとやはり、SQL ServerはShift-JISらしく(Unicode格納型もあるみたいだし…)、多分指定が悪いに違いない。
まだ試していないけど、 Linux で SQLServer + PHPで書かれているように
tds version = 8.0 <-SQLServer2000を指す charset = sjis <-SQLServer2000のDBの文字コード client charset = UTF-8 <-(株)などの機種依存文字を化けないようにするため変更して試してみようと思う。freeTDS自体は設定ファイルを見る限り、文字コードはうまくいきそうな様子だったので、ちょっと期待。うまくいったら拍手喝采…