空があんなに高い
歌って踊れるプログラマーを目指して

プロフィール
どんぱん
Author: どんぱん

最近の記事とコメント
トラックバックリスト
カテゴリ
ユーザータグ
過去ログ
メールフォーム

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--/--/--(--) | スポンサー広告

NKFでUTF-8に変換するとおかしい

NKFでShift_JISのテキストをUTF-8に変換すると、「~」が「〜」に化けます。この現象が前から気になっていたので調べてみました。

Shift_JISで全部の文字コードを書いたテキストファイルを作り、Windowsのエディターを使ってこれをUTF-8で保存したファイルと、同様にNKFで変換したファイルを作ります。
この2つを比べてみると、(第1水準以下で)違いがあったのは以下の10文字でした。(第2水準以上ではだいぶ違っていたような気がしましたが、見なかったことにします。)

WindowsNKF
¥
¢
£
¬
¦

Unicodeのコード空間はShift_JISより広く、Shift_JISの1文字がUnicode空間上では複数の文字に対応づく場合があります。上記のことが起こるのはこのためで、NKFの変換結果は必ずしも間違いではありません。
ですが、変換した結果をWindows上で見たり編集したりする必要がある場合は、Windowsと同じ結果を得たいところです。
これには、NKFの出力の文字コードを上記のとおりに置き換えると、いい感じの結果になります。

Rubyで書くとこんな感じです。

sjis.rb:
require 'nkf'
while !STDIN.eof
  l = NKF.nkf("-Sw", readline)
  table = [
    [ "\xe2\x80\xbe", "\xef\xbf\xa3" ], #  ̄
    [ "\xe2\x80\x94", "\xe2\x80\x95" ], # ―
    [ "\xe3\x80\x9c", "\xef\xbd\x9e" ], # ~
    [ "\xe2\x80\x96", "\xe2\x88\xa5" ], # ∥
    [ "\xe2\x80\x92", "\xef\xbc\x8d" ], # -
    [ "\xc2\xa5", "\xef\xbf\xa5" ], # ¥
    [ "\xc2\xa2", "\xef\xbf\xa0" ], # ¢
    [ "\xc2\xa3", "\xef\xbf\xa1" ], # £
    [ "\xc2\xac", "\xef\xbf\xa2" ], # ¬
    [ "\xc2\xa6", "\xef\xbf\xa4" ], # ¦
  ].each do |t|
    l.gsub!(/#{t[0]}/, t[1])
  end
  print l
end

このソースをShift_JISで書いたとして、
$ nkf -Sw < sjis.rb > u.txt
とやると、もともとNKFが変換した結果になり、
$ ruby sjis.rb < sjis.rb > u2.txt
とやると、Windowsと同様の結果になります。

なお、NKFを使うときに、Shift_JIS←→EUCの変換は上記の問題がありません。UTF-8→Shift_JIS/EUCも問題ありません。注意すべきなのはShift_JIS/EUC→UTF-8の変換のみです。
関連記事
スポンサーサイト


※任意
※任意


※入れておくと後で編集できます
管理者のみ閲覧可

help

この記事のトラックバックURL:
カレンダー
2018/08
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -
ページナビ
twitter
スケジュール
ピンイン入力
四声数字を四声記号に変換します
(a,e,i,o,u,v(=ü); 1,2,3,4)

リンク集
Copyright 2018 空があんなに高い Some rights reserved.
Photo by Rain Drop // Template by chocolat* // Powered by FC2
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。