【Unity】【C#】ランタイムで Shift JIS を使う 
2020/09/27 Sun [edit]
利用頻度はあまり無いとは思うのだが、特に少し古い Windows アプリなどでは日本語エンコードが Shift JIS だったりするので、それを Unity で扱おうとすると、以下のエラーが出る。
といっても、エディタ上では出ないので、ついうっかりそのままアプリをビルドしてしまうと、ランタイム時のみエラーが出るという事態になる。
まぁ、ググれば対処法は出てくるのだが、情報が古いのか、微妙にわかりずらい所があったので、上手く行った方法を備忘録として残しておこう。
(※) Unity 2019.2.21f1 / Windows10(x64) で確認
■Shift JIS を使うための dll をインポート
以下のヘルプデスクにも出ているのだが、Unity のエディタで使われている「I18N.CJK.dll」「I18N.dll」という2つの dll がある。これをプロジェクトにコピー(インポート)しよう。
・System.Text.Encoding で Shift JIS を使いたい
具体的には、以下のパス(フォルダ)
(Unityをインストールしたフォルダ)/Editor/Data/Mono/lib/mono/unity
を OS のエクスプローラで開き、Unity エディタ内で「Plugins」フォルダを作り、そこに配置する。

使うプラットフォームを限定したいなら、インスペクタで dll をクリックし、Import Settings で選択してやるのも良いが、とりあえずならデフォルトのままでも良い(または Plugins フォルダ配下にプラットフォーム用フォルダを作成して入れる)。
冒頭に「情報が古いのか」と書いたのはこの辺りで、少なくとも現バージョンでは Assets 直下には置かない方が良いっぽい(上手く動かなくなる)。
ちなみに「Plugins」フォルダなど特殊なフォルダはコンパイル順やプラットフォームを分けるなどの役割があり、一応 dll のような静的なライブラリ(本来、編集することなどないもの)は Plugins フォルダに入れておけば、毎回コンパイルされることもなく、ビルドも高速になる。
少し古い記事だが、以下はわかりやすかったので、参考資料に載せておこう。
・Unityの特殊フォルダと各々の役割(追記版)
・特殊フォルダーとスクリプトのコンパイル順 (公式マニュアル)
とりあえずは、これだけで準備は完了だ。
■簡単なテスト
テストとして、Shift JIS で保存したテキストファイルを適当に作って、読み込んでみよう。
注意して欲しいのは、エディタ上ではプロジェクトに dll が無くても成功してしまうので、一旦アプリとしてビルドして、ランタイムで確認して欲しいということだ。
例えばだが、以下のようなスクリプトを書いて、絶対パスでファイルを指定して、読み込んだものがエラーも出ず、文字化けもしなかったなら成功だ。
●Shift JIS でのテキストファイル読み込みテスト
using System;
using System.IO;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
public class ShiftJISTest : MonoBehaviour //※名前は任意
{
//Shift JIS で保存したテキストファイルを指定
public string path = @"D:\test\ShiftJIS.txt";
//表示用 Text
public Text displayText; //インスペクタでセットしておく
// Use this for initialization
private void Start()
{
LoadShiftJisTextAndDisplay(); //Shift JIS でのテキストファイル読み込み
//LoadTextAndDisplay(); //デフォ(UTF-8)でのテキストファイル読み込み
}
//Shift JIS でのテキストファイル読み込み&表示
void LoadShiftJisTextAndDisplay()
{
try
{
var bytes = File.ReadAllBytes(path);
var encoding = Encoding.GetEncoding("Shift_JIS");
var dst = Encoding.Convert(encoding, Encoding.Default, bytes);
displayText.text = Encoding.Default.GetString(dst);
}
catch (Exception e)
{
displayText.text = e.Message; //エラーのときは、メッセージが出る
}
}
//デフォ(UTF-8)でのテキストファイル読み込み&表示
void LoadTextAndDisplay()
{
try
{
var text = File.ReadAllText(path);
displayText.text = text;
}
catch (Exception e)
{
displayText.text = e.Message; //エラーのときは、メッセージが出る
}
}
}

ちなみに LoadTextAndDisplay() の方で Shift_JIS エンコードしないで、デフォルト(UTF-8)で読み込んだ場合は文字化けする。

また、dll が無い場合はエラーとなる。

(関連記事)
【Unity】【C#】テキストファイルの読み書きをする(リソース/ストレージ)
【Unity】【C#】制限付きでテキストのサイズに合わせて他のオブジェクトのサイズも変化させる
- 関連記事
トラックバック
トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/364-2acb2ec2
この記事にトラックバックする(FC2ブログユーザー)
| h o m e |