最近の Gedit は Windows から持ってきた Shift-JIS のファイルを普通に読み込める。
ように思えますが実はチルダがバケる。
と秀丸で Shift-JIS 保存したものを Fedora に持ってくる。
ついでに iconv で CP932 及び SJIS 変換した例を下記に。
つまり Gedit は CP932 ではなく Shift-JIS から変換しているのですね。
Linux の持っていく場合は Windows 上で BOM 無し UTF-8 に変換しよう。
もし持ってきた後で気がついたら iconv で変換。
しかし天下の秀丸様でさえ CP932 を Shift-JIS なんて表記しているから困る。
Windows システムデフォルトのまま保存すると CP932 であるというのに。
この事実って Windows しか使えない人のほとんどが知らないという…
ということで。
Linux ユーザーにはお馴染みの iconv ですがプログラムから変換するにはどうする?
Python なら普通に文字コード変換関数があるけど Vala 等を使いたい時に困るので。
調べると、どうやら g_convert 関数で変換できるようだ。
Python
#!/usr/bin/env python #-*- coding:utf-8 -*- import sys from gi.repository import GLib try: result, contents = GLib.file_get_contents(sys.argv[1]) if result: try: text, bytes_read, bytes_written = GLib.convert(contents, len(contents), "UTF-8", "CP932") print text except Exception, e: print "ConvertError: {0}".format(e) except Exception, e: print "FileError: {0}".format(e)
Vala
using GLib; public class Conv { public static int main(string[] args) { try { string contents; bool result = GLib.FileUtils.get_contents(args[1], out contents); if (result) { try { string text = GLib.convert(contents, contents.length, "UTF-8", "CP932"); stdout.printf(text); } catch (GLib.ConvertError e) { stdout.printf ("ConvertError: %s\n", e.message); return 1; } } } catch (GLib.FileError e) { stdout.printf ("FileError: %s\n", e.message); return 1; } return 0; } }
こんな感じでいいみたい、Python でも Vala でも問題なく g_convert で変換できる。
Vala は例外処理を書かないとコンパイルで警告になるのが少し面倒だよね。
valadoc.org とニラメッコしなきゃ書けないよ。