utf8移行と自分メモその2

で、趣味は読書SNSは、utf8環境となった、のかな。今まで全部eucだったんで、実際どんなところに影響するのかまだ把握できてない。jisにsjisにeucにutf8に、と。4つも違う文字コードがあるのっておかしいんじゃね。と語尾をちょっと上げてみる。utfに収斂されていく勢い、と思ってもどこかのベンダーが妙な拡張してまた違うコードが出てきたりして。
てのはともかく。
今さらだけど perl5.8は。
出入りするデータはただのバイト列として扱う。utf8を扱うにはutf8フラグを立ててperlにこれはutf8として扱ってね、と教える必要がある。encoding とか use utf8 なんかがフラグ立てに使われるらしい。
今後推奨されるのはスクリプトをunicodeで書いて use utf8 する書き方だそうだ。そうするとスクリプト内の文字列には utf8フラグがつくのでなにかと便利、なのかな。
わたしが混乱したところ。
文字コードとしてのutf8とperlのutf8フラグは「また別」。
postgresqlから取り出したばかりのutf8の文字「根性」とスクリプト内のutf8フラグの立ったutf8文字列「根性」をそのまま比較しても意図した通りにはならない
取れたての「根性」 != スクリプト内の「根性」
となる。取れたての「根性」にはutf8フラグが足りないのだ。
Encode::decode(’utf8’,「根性」)などと「根性」にutf8フラグをつけてやれば
「根性」==「根性」
となる。それじゃせっかくだしprintしてみるか、と「根性」を出すと wide char うんぬんと脅される。utf8フラグのついた文字列を表に出すとケチをつけられるのだ。
Encode::encode(’utf8’,「根性」)とやって今度はutf8フラグを落としてやると警告は出なくなる。
勘違いしてたんだけど、utf8フラグというのはperlの内部のフラグ。
これをくっつけて出力するわけではない。
リダイレクトすれば普通に「文字コード」utf8で書き込まれるだけ。データベースへのinsertも同じこと。
Encodeのdecodeとencodeてのは。
「jis、sjis、euc、utf8」で書かれた文字列にutf8フラグをつけるのがdecode(その文字列がどのコードで書かれているのか教えてutf8フラグをつける)
utf8フラグがついてしまえば自由自在でごにょごにょ。その後表に出すような時にエクセルで読むからシフトJISでお願いと言われたらencodeで「jis、sjis、、euc、utf8」に変換する。この時utf8フラグも落とすので上のwide char うんぬんの警告は出ない。
decodeでutf8フラグをつけて、内部処理が終わったらencodeでutf8フラグを落としましょう、ということかな。
unicodeで書かれたスクリプトにutf8フラグをつけると変数名に「日本語」が使えたりする。
use utf8
my $気合=10:
while($気合--){
print Encode::encode(’utf8’,’喝’);
}
喝喝喝喝喝喝喝喝喝喝
となる。スクリプトがわかりやすいぞ。
my $除夜の鐘=108;
my $鐘の音=’ゴーン’;
my $おやじギャグ=’カルロス’;
というのを見るだけでなにをしようとしてるのか分かるでしょ。
て、ネタを続けるのはうるさい、な。
postgresqlからselectなりで読み込んだらdecodeする必要がある(全部が全部というわけじゃないけど)。スクリプトのあちこちに散らばるselectを探していちいちdecodeなんちゃらと書き込むのは勘弁してほしい。ので検索してみると、decode encode のための wrapperを自前で作るひともいたけど、perl DBI DBD-Pgと postgreql だと connectしたら
dbh->{pg_enable_utf8}=1
で text と varchar のフィールドから取り出すものに関してutf8フラグをつけてくれる。ありがたい話だ。
今までのスクリプトをほとんどそのまま使える。ただ、wide char うんぬんの警告がうるさいこともあるんで、utf8::is_utf8(文字列) でutf8フラグがついてるかどうかをチェックするようにした。
cgiのformでの文字コードの扱いでもひっかかる。
いやutf8にしたいんだけど、と。
文字コードを変換するためにEncode::encodeを使うにはEncode::decodeでutf8フラグをつけてやる必要がある。ところがdecodeにはその文字列がどの文字コードで書かれているか教えてやる必要がある。
冒頭に書いたように流れてくるコードはjisだなんだで4種類。どのコードなのかわからないので推測するしかない。文字どおりGuessというのがあるんだけど、試しに「アイウエオ」とだけかいたファイルをeuc、sjis、jisの3種類用意して試したところ’shiftsiji or euc’というエラーで死ぬ。ネットで見てると、Guessはできるだけつかわないでね、と。弱ったなあと思いつつ駄目元でJcode.pmを同じファイルに使ってみたところちゃんと判定するじゃありませんか。…???。Encode.pmのwrapperになってるはずなので、結果は同じ(判定に失敗)と思ってた。
ここはありがたくJcode.pmを使わせていただくことに。
標準入力から受け取ったら、
Jcode::convert($str,’utf8’)
と文字コードをutf8に。(互換のために参照渡しでもいいけど、参照渡しにする必要はないっぽい)多分文字コードを変える時にutf8フラグを落とすので、Jcodeで文字コードを変えたら
Encode::decode(’utf8’,文字)と、utf8フラグをつけてあげる。
もしかするとperlIOで上記の手間は不要かもしれないなぁ。
んで、urlエンコードする場合はutf8フラグを落としてやらないと、エンコードされす、日本語なんかがそのまま流れることになるので要注意。
昨日に続いて長文連載。どうせ忘れるに決まってるから、こうやってあちこちに自分メモ、だ。
こっちのページもutf8に移行するかなぁ。
| << | 2026/1 | >> | ||||
|---|---|---|---|---|---|---|
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
【最近の20件】
- 20260129 ブログをレスポンシブ対応にリニューアル
- 20260126 ブログのふり返り
- 20260121 小ネタ:ed25519秘密鍵公開鍵とJson serialized canonical
- 20260120 ActivityPubは自作実装しよう!
- 20260117 RFC9421版HTTP Signatureに対応
- 20260111 HTTP Signatureの署名対象文字列
- 20260109 web本棚のActivityPub対応
- 20260106 web本棚のソースコード公開
- 20260104 web本棚
- 20260101 謹賀新年2026
- 20251231 2025年ふりかえり
- 20251213 perlと30年
- 20251210 ActivityPubの投稿削除
- 20251101 日常雑感
- 20251026 テキトーフェッチメール
- 20251014 ActivityPubサーバーで投稿の編集
- 20251008 元WINDOWS10のノパソにlinux mint
- 20251002 GBLシーズン「変わりゆく物語」でACE到達
- 20250925 ブログのアクセス制限
- 20250922 ActivityPubサーバーに引用を実装


