IT Office Nishimiyahara

個人用スマホから商用プログラミングまでなんでもお任せ下さい

DBD::SQLiteの入出力をちゃんと考えてみる

      2014/03/02

なんとか上手くいく方法はないものかと。

定石では、標準出力は『binmode STDOUT, ':encoding(shiftjis)';』でutf8からshiftjisに変換できるはずですが、なぜか上手く行かず…。

普段から「binmode STDOUT => ":encoding(cp932)";」をよく使うので、なんとかならないかやってみました。
やってみればちゃんと出来るものです。


基本的には、Perlの内部形式の考え方をおさらいする形になった。
プログラムで扱う前にdecode、出力するときはencodeする。
それは、標準入出力だろうが、データベースだろうが、同じ扱い、ということ。
SQLiteはutf8の入出力が(少なくともver3.6.13では)可能のようだ。
まずは出力の時、データベースに渡すステートメントは「Encode::encode_utf8」してから出力する。
そして入力の時、つまり、データベースからデータを取る時は、とって来た後に「Encode::decode_utf8」する。
イメージは下の図。
今回は出力だけなのでSTDINは使っていないが、binmode STDOUTをencodingで使う場合は、あわせて指定しておくのが定石だと思われる。

「binmode STDOUT => ":encoding(cp932)";」とやる場合、printする時は内部形式のまま出力するように書けばいいので、他には何もすることがない。
他にも挙動を調べたかったので、中身は少し変えた。
スクリプト

実行結果

SQLiteは手軽に使えるので、使い方をちゃんと考えてみるのも良いもんだ。

respo

respo link

ZenBackWidget

 - 情報技術について