「MonoでSHIFT-JISを扱う」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
(Administrator がページ「Mono/SHIFT-JISを扱う」を「MonoでSHIFT-JISを扱う」に移動しました)
 
(他の1人の利用者による、間の2版が非表示)
5行目: 5行目:
  
 
==検証==
 
==検証==
[[文字コード]]が[[SHIFT-JIS]]の[[テキストファイル]]を用意する。
+
まず[[文字コード]]が[[SHIFT-JIS]]の[[テキストファイル]]を用意する。
 
なお、検証に使用した[[Mac OS X 10.10]]には初期状態では[[nkf]]が入っていないので[[homebrew]]からぶち込んである。
 
なお、検証に使用した[[Mac OS X 10.10]]には初期状態では[[nkf]]が入っていないので[[homebrew]]からぶち込んである。
 
<source lang="bash">
 
<source lang="bash">
39行目: 39行目:
  
 
==回避策1==
 
==回避策1==
[[Unity]]や[[PS Suite]]で使われている古い[[Mono]]だと[[文字化け]]どころかクラッシュするという理由で作られたものらしい。
+
utf8-sjis-encoderというイカす[[ライブラリ]]を[[GitHub]]で発見した。
 +
これは[[Unity]]や[[PS Suite]]で使われている古い[[Mono]](.NET Framework 2.0系相当)だと[[文字化け]]どころか[[クラッシュ]]するという理由で作られたものらしい。
 
[[NuGet]]はないようなので[[GitHub]]から[[ソース]]を拾ってきて使ってみた。
 
[[NuGet]]はないようなので[[GitHub]]から[[ソース]]を拾ってきて使ってみた。
なお、この[[ライブラリ]]の変換テーブルは巨大な[[ソースコード]](to_jis.csとto_utf8.cs)となっており[[Xamarin Studio]]で開くと残念な結果になる。
+
なお、この[[ライブラリ]]の[[変換テーブル]]部分は巨大な[[ソースコード]](to_jis.csとto_utf8.cs)となっており[[Xamarin Studio]]で開くと残念な結果になる。
*https://github.com/GRGSIBERIA/utf8-sjis-encoder
+
* https://github.com/GRGSIBERIA/utf8-sjis-encoder
  
 
検証
 
検証
69行目: 70行目:
 
  ロミオ×ジュリエット
 
  ロミオ×ジュリエット
  
ちゃんと表示された。
+
正常に表示された。素晴らしい。
  
 
==関連項目==
 
==関連項目==

2020年12月23日 (水) 03:08時点における最新版

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[編集 | ソースを編集]

utf8-sjis-encoderというイカすライブラリGitHubで発見した。 これはUnityPS Suiteで使われている古いMono(.NET Framework 2.0系相当)だと文字化けどころかクラッシュするという理由で作られたものらしい。 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);
        }
    }
}

実行結果

ロミオ×ジュリエット

正常に表示された。素晴らしい。

関連項目[編集 | ソースを編集]

参考文献[編集 | ソースを編集]