WindowsアプリとAndroidアプリでは使用する文字コードが異なることについて ( Windowsアプリでは主に『シフトJIS』、Androidアプリでは『UTF-8』 ) |
ここでは主に Windowsアプリの開発経験がある方向けに、文字コードについての解説や Windowsアプリを Androidアプリに移植する際の注意点などをご説明します。 1.文字を数値で表現する際のフォーマット( 文字コード )について 2.日本の Windowsアプリは特に気にしないと文字コード『シフトJIS』を使用するアプリになります 3.Androidアプリでは文字コード『シフトJIS』の代わりに、文字コード『UTF-8』になります 4.文字コード『シフトJIS』から文字コード『UTF-8』へ移行する際に必要な作業 5.Windowsアプリで使用する文字コードを『UTF-8』にする方法 1.文字を数値で表現する際のフォーマット( 文字コード )について コンピュータ上では画像も音も文章も全て数値で扱いますが、例えばコンピュータ上の画像データは BMP だったり JPEG だったり PNG だったりと、何れも画像を表現するためのデータフォーマットで、 ファイルの中身は数値の集合なのですが、データフォーマットによってその表現の形が異なります。 テキストデータは画像データやサウンドデータほどデータフォーマットについて気にすることなく 扱うことができるので知らない方も多いかもしれませんが、文字にもデータフォーマットのようなものである 『文字コード』があります。 例えば『あ』という文字は『シフトJIS』という文字コードでは16進数表現で『82 A0』と 2バイトで 表現されますが、『UTF-16LE』という文字コードでは同じ 2バイトでも『42 30』と表現され、 『UTF-8』という文字コードでは『E3 81 82』と 3バイトで表現され、数値どころか 1文字を表現する バイト数まで異なってしまったりします。 ですが、何れも文字『あ』を表現していることには代わりはありません。BMPファイルでも PNGファイルでも、全く同じ画像であれば、ファイルサイズと中身の数値の集合が異なっても画面に 表示される画像が同じであるのと同様です。 ただ、画像のデータフォーマットが異なれば、それを扱うプログラムもデータフォーマットに適合した ものに変更しなければならないのと同じように、文字列データも各文字コード( 文字データフォーマットと 考えると分かりやすいです )に適合したプログラムを組む必要があります。 2.日本の Windowsアプリは特に気にしないと文字コード『シフトJIS』を使用するアプリになります では普段 Windowsアプリを製作されている方は何の文字コードを使用しているかと言いますと、 特に文字コードを気にせず開発されている方は高確率で『シフトJIS』という昔から日本で使用されている 文字コードを使用してプログラムのソースコードやゲーム画面に表示する文章を扱っていると思います。 ( 何故かというと VisualStudio で新規作成する cppファイルや、メモ帳などのテキストエディタで 新規作成した txtファイルは、特に指定がない限り文字コード『シフトJIS』形式のファイルとなる為です ( ただ、『シフトJIS』は主に日本でのみ使用されている文字コードなので、英語版 Windows のメモ帳や、 海外製のテキストエディタでは違います ) ) 『シフトJIS』は『半角文字は1バイト、全角文字は2バイト』で、1バイト目の数値から 全角文字( 2バイト文字 )なのか半角文字( 1バイト文字 )なのかを判断できるなどの特徴があるので、 ゲームで文章を 1文字単位で扱ったことがある方には馴染みのある文字コードではないかと思います。 因みに VisualStudioシリーズも、日本語版では古くからプログラム中に『"あいうえお"』というように 『""』で括られた文字列は『シフトJIS』形式の文字列として扱われ、なんとご丁寧にプログラムが 書かれた cppファイルが『UTF-8』などの『シフトJIS』以外の形式で保存されていても『""』で括られた 文字列データはコンパイルの際に『シフトJIS』形式の文字列に変換してくれます。 DXライブラリも特に指定が無ければ LoadGraph や DrawString などに渡される文字列データは 『シフトJIS』形式として扱うので、VisualStudio、テキストエディタ、DXライブラリ全てが 『文字列データは「シフトJIS」』として扱うことになり、開発者は『文字データは半角文字は 1バイト、 全角文字は 2バイト』とだけ理解しておけば、扱っている文字列データが何の文字コードなのか特に 気にすることなく作業をすることができる、というわけです。 3.Androidアプリでは文字コード『シフトJIS』の代わりに、文字コード『UTF-8』になります ただ、それは Windowsアプリでのことで、Androidアプリでは『シフトJIS』は影も形もありません。 DXライブラリ Android版を使用して Androidアプリのプログラムを組む際も Windowsアプリを 開発するときと同じ VisualStudio Community 2015 を使用することができるのですが、Windowsアプリと 異なり文字列データは『シフトJIS』形式ではなく『UTF-8』形式として扱われます。 『シフトJIS』形式で保存された cppファイルも『UTF-8』形式の cppファイルとして扱われてしまうので、 『シフトJIS』形式の cpp ファイルに『"あいうえお"』などの全角文字が含まれる文字列データが 記述されていると、コンパイルの際に『認識できない文字です』としてエラーが発生してコンパイルが 失敗してしまいます。( 因みに半角文字だけだとエラーが発生しません、何故なら『シフトJIS』形式の 1バイト文字は『UTF-8』形式の 1バイト文字と同一の部分が多いからです ( 例えば『シフトJIS』での 『A』は 16進数で『41』の 1バイトで表現されますが、『UTF-8』でも『A』は 16進数の『41』の 1バイトで表現されます ) ) なので、プログラム中に全角文字を含む文字列データを記述したい場合は、VisualStudio Community 2015 で cppファイルを開いた状態で、メニューから『ファイル(F)』→『保存オプションの詳細設定(V)...』を選択して 『保存オプションの詳細設定』ダイアログを表示して、『エンコード(E):』の項目を 『日本語(シフトJIS) - コードページ 932』から『Unicode(UTF-8 シグネチャ付き) - コードページ 65001』 に変更して『OK』ボタンを押して、cppファイルを『UTF-8』形式で保存する必要があります。 ただ、cppファイルを『UTF-8』形式にした場合、プログラム中に書いた『"あいうえお"』は最早 『シフトJIS』形式ではなく『UTF-8』形式になっているので、『シフトJIS』形式の文字列を処理する 『半角文字は1バイト、全角文字は2バイト』を前提としたプログラムを組む代わりに『UTF-8』形式の 文字列を処理する『半角文字は1バイト、全角文字は3バイト』を前提としたプログラムを組む必要があります。 ( 日本で使用されている全角文字は『UTF-8』では概ね 1文字 3バイトとなっています ) 『シフトJIS』の場合は 1文字が何バイトかは 1バイト目の数値を調べることで判断することが できますが、『UTF-8』では 1文字が何バイトかの判定の仕方が『シフトJIS』より若干複雑なので、 『UTF-8』形式の 1文字のバイト数を調べる際はDXライブラリの関数『GetCharBytes』を使用すると 便利です。( 1文字のバイト数を取得するための関数です ) 4.文字コード『シフトJIS』から文字コード『UTF-8』へ移行する際に必要な作業 これは主に文字コード『シフトJIS』を使用している Windowsアプリを Androidアプリに移植する場合に 必要な作業についてのお話です。 『シフトJIS』を使用している Windowsアプリを Androidアプリに移植する場合は、以下の作業を行う 必要があります。 ① 全ての cppファイルや hファイルを『シフトJIS』形式から『UTF-8』形式に変換する 前述の通り、Androidアプリ用の C++ コンパイラは『シフトJIS』形式のプログラムファイルを正常に コンパイルすることができないので、全ての cppファイルや hファイルを『シフトJIS』形式から 『ファイル(F)』→『保存オプションの詳細設定(V)...』を使用して全て『UTF-8』形式に変換する必要があります。 ② アプリ内で扱うテキストファイルも全て『UTF-8』形式に変換する txtファイルなど外部のファイルからゲーム中に表示する文章データを読み込んでいた場合は、それらの txtファイルの文字コードも『UTF-8』形式に変換する必要があります。 例えば、Windows標準のテキストエディタである『メモ帳』の場合は、メニューの『ファイル(F)』→ 『名前を付けて保存(A)...』を選択すると表示される『名前を付けて保存』ダイアログの下部にある 『文字コード(E):』の項目を『ANSI』から『UTF-8』に変更してから保存することで、txtファイルの 文字コードを『シフトJIS』から『UTF-8』に変換することができます。 ③ 文字列データを『シフトJIS』形式として扱っているプログラムを全て『UTF-8』形式として扱うプログラムに書き換える 上記二つの作業をすることでプログラム中に『""』で括って記述された文字列データもファイルから 読み込む文字列データも『UTF-8』形式となりますので、その文字列データを扱うプログラムも 『UTF-8』形式を扱うものに変更する必要があります。 主に変更することになるのは文字列中の文字を 1文字単位で扱う処理を行っているプログラムだと思います。 『シフトJIS』形式では 1文字が半角文字の場合は 1バイト、全角文字の場合は 2バイトですが、 『UTF-8』形式では( 主に日本語で使用される文字では )半角文字の場合は 1バイト、全角文字の 場合は 3バイトとなります。 ただ、『UTF-8』の仕様上は 1文字のバイト数は 1~6バイトなので、『シフトJIS』よりも 1文字のバイト数を判定する処理も複雑になります。なので、『1文字が何バイトなのか』を調べる際は DXライブラリの関数『GetCharBytes』を使用するようにしてください。 ( 引数で渡した文字列の最初の文字のバイト数を返す関数です ) 5.Windowsアプリで使用する文字コードを『UTF-8』にする方法 前述の通り文字コード『シフトJIS』を使用する Windowsアプリを文字コード『UTF-8』を使用する Androidアプリに移植する際は『シフトJIS』を使用している文字列データやプログラムをすべて 『UTF-8』を使用するように変更する作業が発生するので大変です。( Androidアプリで無理矢理 『シフトJIS』を使用する方法もありますが、それはもっと大変です ) それならば、Androidアプリとしてもリリースする予定の Windowsアプリでは、Windowsアプリでも 『UTF-8』を使用するようにして、Androidアプリへの移植の際に『シフトJIS』のデータやプログラムを 『UTF-8』用に変更する作業を無くした方が得策です。 ただ、VisualStudio Community 2015 で Windowsアプリを作成する場合、『シフトJIS』の代わりに 『UTF-8』を使用するには少しだけ手順が必要なので、その方法を以下に記載します。 ① DxLib_Init を呼ぶ前に SetUseCharCodeFormat( DX_CHARCODEFORMAT_UTF8 ); を呼ぶ DXライブラリは Windowsアプリではデフォルトで『シフトJIS』を使用するようになって いますので、DxLib_Init を呼ぶ前の個所に SetUseCharCodeFormat( DX_CHARCODEFORMAT_UTF8 ); を 記述して使用する文字コードを『UTF-8』に変更します。 この記述を増やした状態でプログラムを実行すると DrawString に渡す文字列も、LoadGraph や LoadSoundMem に渡すファイルパスの文字列も『UTF-8』形式として処理されるようになります。 ② プログラム中の文字列の先頭に『u8』を記述する 例えばプログラム中に文字列を『"あいうえお"』と記述していた場合は、ここの先頭に『u8』を 付け足して、『u8"あいうえお"』とします。 この『u8』は『UTF-8』を意味していて、これを文字列の先頭に付けることでその文字列を 『UTF-8』形式にすることができます。 「態々『u8』を付けなくてもプログラムファイルを『UTF-8』形式で保存していれば、 そのプログラム中に書かれた『""』で括られた文字列も『UTF-8』形式になるのでは?」 という疑問が沸くかもしれませんが、Androidアプリ用のコンパイラと異なり、Windowsアプリ用の コンパイラは、プログラムファイルが何の文字コードで保存されていても、プログラム中に『""』で 括られて書かれた文字列データは特に指定が無ければ全て『シフトJIS』形式に変換されてしまうので、 『u8』を記述して、明示的に「この文字列は『UTF-8』形式です」とコンパイラに知らせる 必要があるわけです。 ③ アプリ内で扱うテキストファイルを全て『UTF-8』形式で保存する txtファイルなど外部のファイルからゲーム中に表示する文章データを読み込む場合は、それらの txtファイルを作成した際に文字コードを『UTF-8』に変更する必要があります。 例えば、Windows標準のテキストエディタである『メモ帳』の場合は、メニューの『ファイル(F)』→ 『名前を付けて保存(A)...』を選択すると表示される『名前を付けて保存』ダイアログの下部にある 『文字コード(E):』の項目を『ANSI』から『UTF-8』に変更してから保存することで、txtファイルを 文字コード『UTF-8』形式で保存することができます。 上記の3つを行えば、Windowsアプリでも文字コード『UTF-8』の使用で統一することができます。 戻る |