MonoでSHIFT-JISを扱う

提供: MonoBook
2015年9月25日 (金) 01:51時点における180.53.153.125 (トーク)による版 (ページの作成:「2015年9月時点のXamarin.MacXamarin.iOSを含むMono環境下ではシフトJISを扱うと一部文字化けするようだ。 Xamarin.Androi...」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

2015年9月時点のXamarin.MacXamarin.iOSを含むMono環境下ではシフトJISを扱うと一部文字化けするようだ。 Xamarin.Androidでは検証していないが同様だと思われる。

価格帯的に一定規模以上の業務システム社内システムでの使用が多いと思われるXamarinでは、シフトJISで書かれたCSVファイルなどを介した外部システムとの連携は必ずと言っていいほど発生すると思われる。

検証

文字コードSHIFT-JISテキストファイルを用意する。 検証はMac OS X 10.10で行ったが初期状態ではnkfが入っていないのでhomebrewからぶち込んである。

$ echo ロミオ×ジュリエット | nkf -s > test.txt

上記のファイルをStreamReaderで読み込んでみる。 System.Text.Encodingがよろしくないようだ。 なお、この現象はPortable.Text.Encoding[1]を使用した場合でも同様であった。

using System;
using System.IO;
using System.Text;

class App
{
    public static void Main(string[] args)
    {
        using (var sr = new StreamReader("test.txt", Encoding.GetEncoding("SHIFT-JIS"))) 
      	{
	    var text = sr.ReadToEnd();
            Console.WriteLine(text);
	 }
    }
}

実行結果

ロミオ?ジュリエット

「×」が「?」に文字化けした。


回避策1

PS Mobileで使われている古いMonoだと文字化けどころかクラッシュするという理由で作られたものらしい。 NuGetはないようなのでGitHubからソースを拾ってきて使ってみた。 なお、このライブラリの変換テーブルは巨大なソースコード(to_jis.csとto_utf8.cs)となっておりXamarin Studioで開くと残念な結果になる。

検証

using System;
using System.IO;
using USEncoder;

class App
{
    public static void Main(string[] args)
    {
        using (var fs = new FileStream("test.txt", FileMode.Open))
        {
            var buf = new byte[fs.Length];
            fs.Read(buf, 0, buf.Length);

            var text = ToEncoding.ToUnicode(buf);
            Console.WriteLine(text);
        }
    }
}

実行結果

ロミオ×ジュリエット

ちゃんと表示された。

関連項目

参考文献