As I Please

MTのいんすとーるの練習と、その他びぼうろく・・・

JSON作成: mysql DB と file からのデータ取り出しで・・・

jsonp を perl ( module JSON) でDBの値やファイルの日本語の string を連結等を行って作成しようとしたら、また日本語 (utf8 flag)ではまった。のでメモ。

  • script は UTF-8 で書き、use utf8 を書いて、scritpの内部の日本語は utf8フラグをつける。
  • DBD::mysql で charset utf8 でやりとりしたデータは hash,scaler ともに utf8 フラグがない。
  • require で読み込んだperl.pm (日本語文字含む)については、use utf8 をつけるとutf8 フラグがつく。 use utf8 が無いと、utf8 フラグがつかない。
  • utf8で書かれた、JSONファイルを スカラーで読み込み、decode_json($) したものについては utf8フラグがある。

ということになっていた。
今回は、ファイルで取り込んだ文字列は すべてutf8::encode($foo); で utf8フラグを落として使った。
また、最終出力は、 print JSON->new->encode($jsonstr) として出力。


モジュールを使った入出力は、丁寧に utf8::is_utf8 を使って、どこでフラグが立っているのか、立っていないのかを調べてから作業したほうが結局早かったかも。
require するときは、そのファイルに日本語が含まれるなら、use utf8 を書くべきかも。

結局、基本に立ち戻って、perlの処理段階ではすべて utf8 flag を立てて( utf8 decodeして)処理することに。

  • 外部の jsonファイルは open FH ,"<:utf8" ,$FILE  と、読み込み時に utf8フラグを立てる。
  • decode_json() は utf8 flag off のstringしか受け付けないので、decode_json(encode_utf8($str)) と、一度フラグを落として、decode_json を通す。戻り値には utf8 flag が立っている。
  • mysql から引っ張ってくるデータについても、取り込んだ時に utf8 flag をつけておくため、$dbh = DBI->connect($dsn,$DB_USERID,$DB_PASSWD,{'mysql_enable_utf8' =>1}) とする。
  • 外部の .pm ファイルについては、utf8 宣言をして utf8フラグを立てる。 require 時にはフラグが立ったまま読み込まれる。
  • 出力するときは、 encode_json($jsonstr) として、utf8フラグが立ったまま encode_json()に渡して出力する。(utf8 フラグが落ちた strings になっている)
問題があるとすれば、debug 時に Dumperを使って表示するときに内部コードになっていること? 日本語を読みたければ毎回 encode してあげないといけないこと、か?

コメントする