Help us understand the problem. What is going on with this article?

Unity(Android)のプロジェクトで#ziplibを使う際の注意点について

More than 1 year has passed since last update.

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

sharp_6
Unityを使ってゲームプログラミングをしていたり。 遠い昔に某分野の物理シミュレータの開発もお手伝いしたりしましたが、今はただの日曜プログラマです。 位置情報を利用した街歩きゲームを作っています。(http://brainmixer.net/CoCAR/linker/) 得意技は、素直には解決できない問題を、力技でどうにかできる手を探して実行することです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away