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ライブラリも特に指定が無ければ LoadGraphDrawString などに渡される文字列データ
  『シフト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』の使用で統一することができます。




戻る