トップ «前の日記(2006-03-20) 最新 次の日記(2006-03-22)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2006-03-21

_ おもしろい

RubyFS

1:55とか100行とかFUSEは後で見る。

_ rubyの-iオプション+-p

今まで\n改行のテキストファイルfooをノートパッドで扱えるように\r\nにするには
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
で良いのか。これは楽だ。

_ 文字コード変換

ってことは、とにかくShift_JISにするには
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が影響するからデコードされるのか)

本日のツッコミ(全5件) [ツッコミを入れる]
_ 成瀬 (2006-03-21 21:19)

"\xC8\xBA"のような文字列だと、EUC-JPで「蛤」、Shift_JISで半角カタカナの「ネコ」になるので、判別不可能とか、nkfの実装によるものとか、正しく判定できない例はいろいろあるかと思います。入力の文字コードがわかるならば明示的に-[JSEW]を指定することをお勧めします。<br>MIMEデコード以外に、nkfはデフォルトで半角カタカナを全角にするので、この動作を抑止したい場合は-xを指定します。

_ arton (2006-03-21 22:00)

具体的な例をありがとうございます。<br>直しておきます。

_ 成瀬 (2006-03-22 01:21)

mime_decode_fは<br>> =?ISO-2022-JP?B?GyRCJCIkJCQmGyhC?=<br>> =?ISO-2022-JP?B?GyRCJCskLSQvGyhC?=<br>といった、複数行にまたがる場合のデコードをする際のflagを意図していたのですが、nkfのターゲットとするルーズな入力だと誤爆が多いので使わないコードになってしまっています。<br>mime_fはデフォルトでSTRICT_MIMEなのでデコードしますね。互換性維持と罠の解体を天秤にかけて、デフォルトでFALSEに変えてしまおうかとも最近思っていますが・・・。

_ arton (2006-03-22 03:09)

なるほど。納得しました。変えるのはどうなのかなぁ? 元々そのほうが良かったはずなのでデフォルト実行になっていると思うのですが、最近は利用のされかたが変わってきたんですかね? (元々はメール用の利用だったのが、最近はHTML用の利用とかかな)

_ 成瀬 (2006-03-22 17:50)

mimeデコードのデフォルト実行は1.7.0で入りました。ご指摘の通り、おそらく当時にUNIXを利用していて別の文字コードに接するケースはもっぱらネットニュースやメールだったのでしょう。わたしがGoogleで検索したり、日記を見回っている限りでは、現在nkfは文字コード変換一般について使われているようです。


2003|06|07|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|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|

ジェズイットを見習え