[ruby-list:43057] Re: Iconvのこと

From: "NARUSE, Yui" <naruse@...>
Date: 2006-12-14 13:06:08 UTC
List: ruby-list #43057
成瀬です。

Shunsuke Takenaka wrote:
> Iconvをつかって「〜」をutf-8からshift-jisへ変換しようとすると、例外が起こります。

0009-BundledLibraries に書いた通り、
「〜」U+FF5E は Shift_JIS への対応が定義されていないため、
CP932 を使いましょうという話になります。

> Iconv.new('shift-jis', 'utf-8').iconv('〜')
# 「-」でなく「_」を使って Shift_JIS の方が無難です
# なお、UTF-8 や EUC-JP は「-」
でなく、
> Iconv.new('cp932', 'utf-8').iconv('〜')
になりますね。

> るびまの第3回も参考にしましたが、解決にはいたりませんでした...
> http://jp.rubyist.net/magazine/?cmd=view&p=0009-BundledLibraries&key=cp932

っとすると、そうしても無理だったのですかね。
# ちなみに Windows-31J = CP932 と考えていいです

だとすると、Iconv が用いている iconv ライブラリが、
CP932 に対応していないことが予想されます。
# Windows に Ruby をどうやってインストールしたかによります
# ActiveScriptRuby の最新あたりは対応してたような

なので、第一には CP932 に対応している iconv をインストールする、
が正解でしょう。

Kconv/NKF モジュールを使うのも 1.8.4 ならば現実的な選択肢です。
Iconv に比べて環境依存がほぼないのでこちらの方が楽かな。
# NKF は ソースを丸ごと Ruby に添付しているので、
# Ruby のバージョンが同じなら NKF も同じ

> 考えたこと
> 1.shift-jisで作ったファイル(tilde.txt)に「〜」を書き込んでおいて、そのファイルを読み込み、該当データの「〜」をreplaceする

utf8_data1 = utf8_data.replace("\xef\xbd\x9e", "\xe3\x80\x9c")
のように、CP932 風の UTF-8 文字列を、
Shift_JIS 風に変えてから処理するのが無難かなと思います。

「〜」以外にもひっかかりうる文字はあるので
http://www.miraclelinux.com/technet/samba30/iconv_issues.html
あたりを参考に・・・、とか考えると面倒になってきますね。

> 2.C++などで作った変換モジュールを通して出力する

文字コード周りは地雷が多いので、なるべく車輪の再発明は避けるべきです。
IBM ICU あたりを使うとかはアリかとは思いますけどね。

-- 
NARUSE, Yui  <naruse@airemix.com>
DBDB A476 FDBD 9450 02CD 0EFC BCE3 C388 472E C1EA

In This Thread