2013年07月26日

文字コード

こんにちは。
つい先日に3本目の親知らずを抜きましたふらふら
ついでだから残りの1本も抜いてしまおうか考えているササモンです。


今回のブログは、文字コードについてちょっと書いてみようと思います目

プログラムを書くときに日本語がまったく入っていないASCIIコードだけでプログラムを書くことは少ないですよね?
コメントだったり文字列リテラルが日本語の場合も少なくないと思います。
そういうときは、ファイルの文字コードをうまく選択しないとコンパイルが通らなかったり
いわゆる「ダメ文字」と言われる文字を使った直後の文字が意図せずにエスケープされておかしくなるなどがありますがく〜(落胆した顔)

さて、ここで問題です。
コンパイルされた後の文字列リテラルの文字コードはどうなっているでしょうか?
例えば、UTF-8で保存したソースをコンパイルした場合

const char* sampleText = "この文字コードは?";

上の文字コードは、ファイルがUTF-8なのでUTF-8・・・、では、ありません。この文字コードは、「環境依存」です。
実行コードの文字コードは、ファイルの文字コードに関わらずコンパイラによって決まっています。
一応、コンパイラのオプションで指定したものに変更出来ることもあります。

そんなことしなくても、大丈夫。次のようにすれば良いという人も居ると思います。

const wchar_t* wideString = L"この文字コードは?";

先ほどとは違い、文字列リテラルの前に'L'を付けてwchar_t型の変数に入れます。
こうすることでワイド文字という扱いになります。
では、この文字コードはどうなるでしょう?wchar_tのサイズ見ると2バイトなのでUTF-16?
答えは残念ながら違いますがく〜(落胆した顔)wchar_tは、1バイトより大きい文字も扱えるようにするための型です。
このため、その文字コードが何であるかは決まっていません。(Unicodeであるかどうかすら決まっていません)
つまり、これまた「環境依存」になります。

ここまで来ると依存症なのかちっ(怒った顔)と愚痴の1つも言いたくもなりますが
C++11またはC11でようやく文字コードを指定できるようになりましたわーい(嬉しい顔)

const char16_t* utf16 = u"utf16です";
const char32_t* utf32 = U"utf32です";

文字列リテラルの前にu(小文字)を付けてchar16_t型に入れることでUTF-16になることが確定します。
そして、文字列リテラルの前にU(大文字)を付けてchar32_t型に入れることでUTF-32になることが確定します。
もちろん文字定数でも同様に指定可能です。
また文字列リテラルのみですが、

const char* utf8 = u8"utf8です";

とu8を前につけるとUTF-8を定義出来るようです。
(これを書いている最中に念のため調べてみるとマクロの_STDC_UTF_16__、__STDC_UTF_32__が1に定義されている必要があるようです。
これが定義されていない場合・・・「環境依存」になりますモバQ

自分の環境だけでプログラムをしていると、その環境でしか通用しない書き方をしているということに気が付かないこともあります。
昨日のブログと打って変わって基本的なところですが、こういう基本のところも大事にしていきたいですね位置情報

それでは。






posted by 管理人 at 18:54 | プログラミング