g_convert

最近の Gedit は Windows から持ってきた Shift-JIS のファイルを普通に読み込める。
ように思えますが実はチルダがバケる。

932

と秀丸で Shift-JIS 保存したものを Fedora に持ってくる。
ついでに iconv で CP932 及び SJIS 変換した例を下記に。

iconv

つまり 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;
    }
}

g_convert

こんな感じでいいみたい、Python でも Vala でも問題なく g_convert で変換できる。
Vala は例外処理を書かないとコンパイルで警告になるのが少し面倒だよね。
valadoc.org とニラメッコしなきゃ書けないよ。