Unityと#ziplib
Unityでwindows/iOS/androidの三者デバイズに対応したアプリを作っています。
で、暗号化zipを色々処理するために#ziplibを使っているのですが、どうもコイツがcp932なんて知らねぇよとエラーを吐きよるのです。(cp932というのはCodePage932。shiftJISの拡張版みたいなヤツね)
で、#ziplibの中身を確認してみると。
public static string ConvertToString(byte[] data, int count)
{
if (data == null) {
return string.Empty;
}
return Encoding.GetEncoding(DefaultCodePage).GetString(data, 0, count);
}
https://github.com/icsharpcode/SharpZipLib
のZipConstants.csより
うん、どうもコード内を確認してみた限りcp932の直接の指定はないけども、このDefaultCodePageが932や437になって問題を起こしてるようだ。#ziplibはcp932やcp437に当然対応してると思ってGetEncodingを投げるのに、アプリはCodePageを知らないという流れかな。(windowsで動かすとcp437は対策しなくても動いたりdllを追加することでcp932も動いたりするので、デバイズ側も色々関係してそう。まぁ今回はそこは詰めないけど)
ということで、ここで力技の出番です。
cp932の代わりにUTF-8として理解させる。
あえての完全無視。無理やりUTF-8として読む!
知らんコードページだとエラー吐くよりは、意味不明な文字列としてでも認識してくれた方が遥かにマシです。……というかぶっちゃけ、『半角英数でファイル名を管理するならどっちでも一緒』ですし。
追加したのは一行だけ(★のコメントをつけたところ)です。
public static int DefaultCodePage {
get {
defaultCodePage = 65001;//★追加。一部のcpはAndroid等でエラー吐くので無理やりUTF8(cp65001)にして読ませる。
return defaultCodePage;
}
set {
if ((value < 0) || (value > 65535) ||
(value == 1) || (value == 2) || (value == 3) || (value == 42)) {
throw new ArgumentOutOfRangeException(nameof(value));
}
defaultCodePage = value;
}
}
Xamarinなら似たような状況でcp932自体をアプリに追加する手があるようなので手っ取り早いのですが……。Unityで同様にする手はどうも見当たらなかった。どなたか知ってれば教えてくださいな~。(windowsだけならUnityのフォルダの中からdll取って来て対応という手もあるのですが)
https://qiita.com/ShikaTech/items/7277af83f4fcb2f81192