HEXA BLOG
ヘキサブログ
プログラム
文字コード
こんにちは。
つい先日に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に定義されている必要があるようです。
これが定義されていない場合・・・「環境依存」になります)
自分の環境だけでプログラムをしていると、その環境でしか通用しない書き方をしているということに気が付かないこともあります。
昨日のブログと打って変わって基本的なところですが、こういう基本のところも大事にしていきたいですね
それでは。
CATEGORY
- about ヘキサ (166)
- 部活動 (6)
- CG (18)
- プロジェクトマネジメント (1)
- 研修 (5)
- 美学 (1)
- いいモノづくり道 (230)
- 採用 -お役立ち情報も- (149)
- プログラム (188)
- デザイン (99)
- ゲーム (274)
- 日記 (1,104)
- 書籍紹介 (113)
- その他 (875)
- 就活アドバイス (20)
- ラーメン (3)
- ライフハック (25)
- イベント紹介 (10)
- 料理 (23)
- TIPS (7)
- 怖い話 (3)
- サウンド (5)
- 子育て (1)
- 筋トレ (1)
- 商品紹介 (21)
- アプリ紹介 (31)
- ソフトウェア紹介 (33)
- ガジェット紹介 (12)
- サイト紹介 (10)
- 研究・開発 (34)
- 回路図 (4)
- アナログゲーム (40)
- 交流会 (21)
- 報告会 (3)
- インフラ (25)
- グリとブラン (6)
- カメラ (9)
- クラフト (27)
- 部活 (14)
- 画伯 (15)
- カレー (6)
- 音楽(洋楽) (6)
- 映画・舞台鑑賞 (43)
- 飼育 (5)
- いぬ (8)
- ねこ (19)
ARCHIVE
- 2024年
- 2023年
- 2022年
- 2021年
- 2020年
- 2019年
- 2018年
- 2017年
- 2016年
- 2015年
- 2014年
- 2013年
- 2012年
- 2011年
- 2010年
- 2009年
- 2008年
- 2007年