著作一覧 |
1. ren foo foo.bak type foo.bak > foo とか 2. File.open("#{ARGV[0]}.new, 'w') do |f| File.open(ARGV[0], 'r').each_line do |line| f.puts line end end # 名前を入れ替える(Tempfile使う場合もあるけど)みたくやってたのだが、単に
ruby -i.bak -p -e '$_' fooで良いのか。これは楽だ。
ruby -i.bak -p -rkconv -e '$_=$_.tosjis' foo
で良いってことか(ちょっと自信がないのは、Kconvが$_(行数分しか情報が無い)を常に正しく判定できるのかわからないからなのだが)。
やっぱりまずいことがあるみたいだ。次のほうが良いらしい(MIMEをデコードする)。(追記:MIMEデコード以外にも実際にまずい例を成瀬さんに教わったので修正)
ruby -i.bak -p -rnkf -e '$_=NKF.nkf("-Esxm0",$_)' foo (EUC-jpからShift_JISの例)
ところで今、ext/nkf/nkf-utf8/nkf.cを見たけど、デフォルトでMIMEデコードはFALSEになっていみだいだけど、何か見間違えてる? (mime_decode_fに気を取られてたけどmime_fが影響するからデコードされるのか)
ジェズイットを見習え |
"\xC8\xBA"のような文字列だと、EUC-JPで「蛤」、Shift_JISで半角カタカナの「ネコ」になるので、判別不可能とか、nkfの実装によるものとか、正しく判定できない例はいろいろあるかと思います。入力の文字コードがわかるならば明示的に-[JSEW]を指定することをお勧めします。<br>MIMEデコード以外に、nkfはデフォルトで半角カタカナを全角にするので、この動作を抑止したい場合は-xを指定します。
具体的な例をありがとうございます。<br>直しておきます。
mime_decode_fは<br>> =?ISO-2022-JP?B?GyRCJCIkJCQmGyhC?=<br>> =?ISO-2022-JP?B?GyRCJCskLSQvGyhC?=<br>といった、複数行にまたがる場合のデコードをする際のflagを意図していたのですが、nkfのターゲットとするルーズな入力だと誤爆が多いので使わないコードになってしまっています。<br>mime_fはデフォルトでSTRICT_MIMEなのでデコードしますね。互換性維持と罠の解体を天秤にかけて、デフォルトでFALSEに変えてしまおうかとも最近思っていますが・・・。
なるほど。納得しました。変えるのはどうなのかなぁ? 元々そのほうが良かったはずなのでデフォルト実行になっていると思うのですが、最近は利用のされかたが変わってきたんですかね? (元々はメール用の利用だったのが、最近はHTML用の利用とかかな)
mimeデコードのデフォルト実行は1.7.0で入りました。ご指摘の通り、おそらく当時にUNIXを利用していて別の文字コードに接するケースはもっぱらネットニュースやメールだったのでしょう。わたしがGoogleで検索したり、日記を見回っている限りでは、現在nkfは文字コード変換一般について使われているようです。