トップ «前の日記(■2008-08-31) 最新 次の日記(■2008-11-01)» 編集

どんぞこ日誌

2003|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|07|08|12|
2007|01|04|08|12|
2008|01|02|03|04|06|07|08|10|11|12|
2009|01|02|04|05|06|07|08|09|11|12|
2010|01|03|04|07|08|10|11|12|
2011|01|02|03|04|05|06|07|08|10|12|
2012|01|02|03|05|06|07|08|09|10|
2013|01|02|07|08|09|
2014|08|09|
2015|08|
2016|06|07|12|
2017|01|03|08|
2018|03|
2022|03|
2023|03|
2024|02|07|10|

同人関連(どんぞこ楽屋) | 旧い雑文   


■2008-10-22

* [Perl] Text::CSVの拡張、Text::CSV::EncodedB!

  久しぶりに新しいモジュールをCPANにアップしました。Text::CSV::Encodedです。基本はText::CSVですが、文字コードの変換も引き受けてくれます。

 $csv = Text::CSV::Encoded->new ({
     encoding_in  => "cp932",
     encoding_out => "utf8",
 });

みたいにやっておくと、後はparse/getline/getline_hrではCSV文字列をencoding_inとしてdecodeします。反対にcombine/printでは出力CSV文字列をencoding_outでencodeします。parse/getlineで得たデータリストをUnicodeにしたくない、あるいはcombine/printに渡すリストはUnicodeではないぞ、という場合は下記のようにします。

  $csv->encoding('euc-jp');

  変換エンジンは標準でEncodeモジュールを使っていて単純にencodingを指定するだけですが、Encode::Guessにもある程度対応しています。

 $csv->coder_class('Text::CSV::Encoded::Coder::EncodeGuess');
 $csv->encoding( ['ucs2', 'ascii'] );
 $csv->print( \@fields ); # Microsoft Excelからのデータ

 これらは当然Perl5.8以降での利用を前提としていますので、古いPerlで使うにはT::C::E::Coder::JcodeやらT::C::E::Coder::UnicodeStringなどを自力で作る必要があります(Jcodeの例はT::C::E::Coder::Baseのドキュメントで触れています)。あとおまけ機能として

    $uni_columns = $csv->decode( 'euc-jp', $csv_line );
    $csv_line    = $csv->encode( 'euc-jp', $uni_columns );

というふうにEncodeチックに使うこともできます。

* [Perl][メモ] 追記B!

miyagawa binmodeとか3引数openじゃだめなん?(はてなブックマーク

  いえ、仰るとおりPerlIO経由でいいと思います。作ったのはText::CSVの拡張機能として前々からH.Merijn Brandと私が欲しかったから。あとExcel→CSV変換でのGuessや、より古いPerlでも使えるように、という理由から。

otsune perl, CPAN 個別のモジュールごとに文字変換を入れるのはPerl5 Unicodeポリシーに反する。とid:dankogaiがDISる流れ?(同上)

おー、そうなんだ。disられるのかしら?

[]