2013-07-19

rubyでutf-8の「-」をsjisに変換しようとしたらエラーが出たとき

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
utf-8からsjisに変換するときのよくある話ではあります。

詳細は、以下のサイトがわかりやすいです。
http://space.geocities.jp/nequomame/java/mojibake/mojibake_01.html

「-」だけでなく他の文字でも同様の問題がおこることがあります。

urf-8の「-」には、見た目は一緒だけど二つ存在します。
そのうち一つは、sjisへの変換に失敗して、もう一つは成功します。

以下のような感じです。

[1] pry(main)> "FF0D".to_i(16).chr('utf-8')
=> "-"
[2] pry(main)> "FF0D".to_i(16).chr('utf-8').encode("cp932")
=> "\x{817C}"
[3] pry(main)> "2212".to_i(16).chr('utf-8')
=> "-"
[4] pry(main)> "2212".to_i(16).chr('utf-8').encode("cp932")
Encoding::UndefinedConversionError: U+2212 from UTF-8 to Windows-31J from (pry):4:in `encode'


なので、「-」が入る可能性がある文字列strに対して以下のように対処してみました。

str.gsub("2212".to_i(16).chr('utf-8'),"FF0D".to_i(16).chr('utf-8')).encode("cp932")

他のやり方もありそうな気がします。

コメントを投稿