From: KIMURA Koichi Date: 2007-05-15T17:20:29+09:00 Subject: [ruby-list:43506] Re: UTF-8でtrがうまく機能しない 木村です。 既に話の型がついちゃってるかもしれませんが。 On Tue, 15 May 2007 15:56:37 +0900 Fujioka wrote: > def str_upcase(str) > oldkcode=$KCODE > $KCODE="UTF-8" > #1 result=str.tr("ャュョァィゥェォッ","ヤユヨアイウエオツ") > #2 result=str.tr("ャュョァィゥェォ","ヤユヨアイウエオ").gsub(/ッ/,'ツ')) > result.gsub!(/ | |\r|\n|\t/,'') > $KCODE=oldkcode > result > end > p str_upcase("ホウジョウ ソウウン") > > 以上のようなコードで#2は動作するのに > #1は文字化けします。 > ッが何か関係しているのか思ってはいるのですが、 > よくわかっていません。 utf-8での、各文字のビットパターンを見るとこんな感じになります。 ヤ :: e3:83:a4 ャ :: e3:83:a3 ユ :: e3:83:a6 ュ :: e3:83:a5 ヨ :: e3:83:a8 ョ :: e3:83:a7 ア :: e3:82:a2 ァ :: e3:82:a1 イ :: e3:82:a4 ィ :: e3:82:a3 ウ :: e3:82:a6 ゥ :: e3:82:a5 エ :: e3:82:a8 ェ :: e3:82:a7 オ :: e3:82:aa ォ :: e3:82:a9 ツ :: e3:83:84 ッ :: e3:83:83 ということと、tr は $KCODEの内容によらずバイトごとに置換を行うので (これはFAQにあるとおり)、ッの最下位バイトの 0x83 と ツの最下位バイト の 0x84のところでおかしくなるのでしょう(他の文字では0x83はそのまま 0x83に置き換わるパターンになっている)。 で、"ホウジョウソウウン"のほうは ホ :: e3:83:9b ウ :: e3:82:a6 ジ :: e3:82:b8 ョ :: e3:83:a7 ウ :: e3:82:a6   :: e3:80:80 ソ :: e3:82:bd ウ :: e3:82:a6 ウ :: e3:82:a6 ン :: e3:83:b3 ホとンに 0x83が含まれているので大当たり、と。 -- 木村浩一