FC2ブログ
ヽ|∵|ゝ(Fantom) の 開発blog? ホーム »2020年09月
2020年09月の記事一覧

【Unity】【C#】ランタイムで Shift JIS を使う  


 利用頻度はあまり無いとは思うのだが、特に少し古い Windows アプリなどでは日本語エンコードが Shift JIS だったりするので、それを Unity で扱おうとすると、以下のエラーが出る。

NotSupportedException: Encoding 932 data could not be found. Make sure you have correct international codeset assembly installed and enabled.

 といっても、エディタ上では出ないので、ついうっかりそのままアプリをビルドしてしまうと、ランタイム時のみエラーが出るという事態になる。

 まぁ、ググれば対処法は出てくるのだが、情報が古いのか、微妙にわかりずらい所があったので、上手く行った方法を備忘録として残しておこう。


(※) 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)で読み込んだ場合は文字化けする。

●文字化けする例(Shift_JIS を UTF-8 で読み込んでるため)


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

●エラー(dll が無いとき)






(関連記事)
【Unity】【C#】テキストファイルの読み書きをする(リソース/ストレージ)
【Unity】【C#】制限付きでテキストのサイズに合わせて他のオブジェクトのサイズも変化させる

関連記事
スポンサーサイト



category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityリファレンス  Unityトラブルシューティング 
tb: 0   cm: --


プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

▲ Pagetop