「MonoでSHIFT-JISを扱う」の版間の差分
ナビゲーションに移動
検索に移動
(→検証) |
Administrator (トーク | 投稿記録) 細 (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]]で開くと残念な結果になる。 |
− | *https://github.com/GRGSIBERIA/utf8-sjis-encoder | + | * https://github.com/GRGSIBERIA/utf8-sjis-encoder |
検証 | 検証 | ||
69行目: | 70行目: | ||
ロミオ×ジュリエット | ロミオ×ジュリエット | ||
− | + | 正常に表示された。素晴らしい。 | |
==関連項目== | ==関連項目== |
2020年12月23日 (水) 03:08時点における最新版
2015年9月時点のXamarin.MacやXamarin.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で発見した。 これはUnityやPS 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);
}
}
}
実行結果
ロミオ×ジュリエット
正常に表示された。素晴らしい。