メインメニューを開く

差分

MonoでSHIFT-JISを扱う

2,672 バイト追加, 2015年9月25日 (金) 01:51
ページの作成:「2015年9月時点のXamarin.MacXamarin.iOSを含むMono環境下ではシフトJISを扱うと一部文字化けするようだ。 Xamarin.Androi...」
2015年9月時点の[[Xamarin.Mac]]や[[Xamarin.iOS]]を含む[[Mono]]環境下では[[シフトJIS]]を扱うと一部[[文字化け]]するようだ。
[[Xamarin.Android]]では検証していないが同様だと思われる。

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

==検証==
[[文字コード]]が[[SHIFT-JIS]]の[[テキストファイル]]を用意する。
検証は[[Mac OS X 10.10]]で行ったが初期状態では[[nkf]]が入っていないので[[homebrew]]からぶち込んである。
<source lang="bash">
$ echo ロミオ×ジュリエット | nkf -s > test.txt
</source>

上記のファイルをStreamReaderで読み込んでみる。
System.Text.Encodingがよろしくないようだ。
なお、この現象はPortable.Text.Encoding<ref>https://github.com/jstedfast/Portable.Text.Encoding</ref>を使用した場合でも同様であった。

<source lang="csharp">
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);
}
}
}
</source>

実行結果
ロミオ?ジュリエット

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


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

検証
<source lang="csharp">
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);
}
}
}
</source>

実行結果
ロミオ×ジュリエット

ちゃんと表示された。

==関連項目==

==参考文献==
{{reflist}}

{{stub}}

[[category:Mono]]
[[category:Xamarin.Mac]]
[[category:Xamarin.iOS]]
匿名利用者