読者です 読者をやめる 読者になる 読者になる

YAML形式でファイルに出力(perl)

YAML形式でのファイル出力に悩んだのでメモ
 
当初シングルバイトの文字列のYAMLだったので↓で動作していました。

use YAML::Syck;
# ヘッダ行無し
$YAML::Syck::Headless = 1;
# クォート
$YAML::Syck::SingleQuote = 1;
DumpFile(FILENAME, \%data) or die $!;

 
しかし、マルチバイトも出力したくなった時に不幸が訪れました・・・
ちなみにシステムの文字コードEUC-JPです。
 
まず普通に出力してみると・・・うほ!バイトコードになっている!?

"result":
- "\xBB\xB0\xB1\xBA\xCE\xC3\xB2\xF0"
- "\xBF\xB9\xCB\xDC\xCE\xB6\xC2\xC0\xCF\xBA"
- "\xC2\xE7\xB8\xA1"
- "\xA5\xAA\xA1\xBC\xA5\xB9\xA5\xC8\xA5\xE9\xA5\xEA\xA5\xA2\xCE\xB1\xB3\xD8"

内部文字コードとかの影響か?・・・と入力文字列をUTF8にしてみると・・

"result":
- "\xE4\xB8\x89\xE6\xB5\xA6\xE6\xB6\xBC\xE4\xBB\x8B"
- "\xE6\xA3\xAE\xE6\x9C\xAC\xE9\xBE\x8D\xE5\xA4\xAA\xE9\x83\x8E"
- "\xE3\x83\x98\xE3\x83\x83\xE3\x83\x89\xE3\x83\x8F\xE3\x83\xB3\xE3\x83\x86\xE3\x82\xA3\xE3\x83\xB3\xE3\x82\xB0"
- "\xE3\x82\xB7\xE3\x82\xB9\xE3\x83\x86\xE3\x83\xA0\xE3\x82\xA8\xE3\x83\xB3\xE3\x82\xB8\xE3\x83\x8B\xE3\x82\xA2"

がふぉ・・・・orz
 
調べてみるとUTF8フラグが付いていないのでバイトコードと判断される模様である。
入力データの文字列を「decode('utf-8', $str)」とUTF8フラグを付けてみると・・

"result":
- '三浦涼介'
- '森本龍太郎'
- '発毛'
- '派遣'

おおおおお。でけた!
しかし、utf8でできても意味がない(汗
調べても思いつかなかったのでYAMLを採用してみる。

use YAML;
YAML::DumpFile(FILENAME, \%data) or die $!;

結果は一応成功、しかし、ヘッダ行が入っていたり、クォートで囲まれてなかったり
ちょっといまいち。
ソースを読んでオプションを探してみるもなさげ・・

    • -

result:
- 三浦涼介
- 森本龍太郎
- ローン
- 過払い

しょうがないので入力文字列をURL_EncodeしてYAML::Syckで出力
なんか負けた気分、他の回避策をみつけたら治そうぜ!>未来の自分

"result":
- '%bb%b0%b1%ba%ce%c3%b2%f0'
- '%bf%b9%cb%dc%ce%b6%c2%c0%cf%ba'
- '%a5%d0%a5%a4%a5%af+%ba%ba%c4%ea'
- '%a5%b7%a5%b9%a5%c6%a5%e0%a5%a8%a5%f3%a5%b8%a5%cb%a5%a2'