最近在開發中要用到GB2312字符編碼(CP936),在C#代碼中便有了如此代碼
1 System.Text.Encoding.GetEncoding(936)
這在Unity3d 編輯器下運行沒有任何問題,打包出exe文件執行時,便會出現程序無響應的情況,查看日志文件可以看到如下錯誤:
NotSupportedException: CodePage 936 not supported
谷歌后...便將I18N.DLL 和 I18N.CJK.DLL 從Unity安裝目錄(Editor\Data\Mono\lib\mono\unity 和 Editor\Data\Mono\lib\mono\2.0 兩個目錄下都存在,PC上測試均可使用)拷貝到項目目錄的Assets目錄下,然后重新編譯出包,正常運行。
在出iOS包時,又再次出現 NotSupportedException: CodePage 936 not supported。前面雖然已經把相關庫文件放到項目之中,但仔細查看xcode工程目錄,其下並沒有I18N.DLL 和 I18N.CJK.DLL 文件的任何影子。此時便想到我們的unity項目中使用的stripping level可能會有影響,索性暫時disable stripping,嘗試重新出iOS包,發現一切正常,再看xcode工程目錄下果然也有了I18N.DLL 和 I18N.CJK.DLL。
那么,問題又來了,如果仍想繼續使用stripping,有沒有辦法?
unity 官方手冊(http://docs.unity3d.com/Manual/iphone-playerSizeOptimization.html)中提到,可以通過添加白名單的方式,在使用stripping時,忽略掉指定的庫。方式是在Assets根目錄下添加link.xml文件,其內容格式如下
1 <?xml version="1.0" encoding="utf-8"?> 2 <linker> 3 <assembly fullname="I18N"> 4 <type fullname="I18N.Common.Manager" preserve="all"/> 5 </assembly> 6 <assembly fullname="I18N.CJK"> 7 <type fullname="I18N.CJK.CP936" preserve="all"/> 8 </assembly> 9 </linker>
使用CP936,只需要添加上述內容。
如此,將該link.xml文件添加到Assets根目錄下后,開啟stripping后,CP936也可以正常使用了~