実践C++入門講座こんにちは。今回は、前回に引き続き、文字の内部表現について解説します。¥マーク問題、次に日本語文字コードについて解説します。文字コードについては本当に奥深いのですが、ここでは各種表示を日本語で出力する程度の「普通」の日本語対応するプログラムを開発する際に知っておくべきこと中心に解説します。昔から日本語対応が進んでいたWindowsは過去幾つかの不幸な決定が重なった結果、頭の痛い問題が複数あります。互換性の維持のためなかなか対策できず、未だに完全解決には程遠い状態です。それらの問題が発生する仕組みと問題を軽減する対策についても一部解説します。\(バックスラッシュ)に化けるように見える問題です。¥マークと\(バックスラッシュ)は文字コードが同じ値なのです。どちらとも0x5cなのです。次のようになっているわけです。その文字を表示する時に使ったフォントによって変わるわけです。いうことは、0x5cの¥マークと\(バックスラッシュ)は、C++は完全に同じものとして取り扱います。それを画面に表示した時に形が異なりますが、それは人にしか見えません。C++には見えないのです。646という国際標準が制定されました。これは7ビットで表現できるコンピュータの文字コードを定める規格です。その時、幾つかの文字コードは国毎に自由に定めて良いことに決まりました。その1つが0x5cです。アメリカは\(バックスラッシュ)、日本はJISで¥マークと定めたわけです。1-3.何がまずいのか?この文字が単に表示だけに用いられるものでしたら、文字が変わることだけ知っていれば大した問題にならないのですが、この文字はコンピュータにとって特別な意味が割り当てられています。‘\n’は改行コードを示します。nの前に¥マークを置いて「エスケープ」することで改行文字を表現しました。他にも多数のエスケープ・シーケンスがあります。“C:¥Windows¥System32′′などフォルダを区切る時、¥マークが使われます。後述しますが、エスケープ文字と同じ文字を区切り記号にするというマイクロソフトの決定は世界中の多くのプログラマを苦労させていると思います。昔はルート・フォルダしかありませんでした。\(バックスラッシュ)でした。/(スラッシュ)で区切っていましたので、同じスラッシュを使ってくれてればと恨めしいです。1-4.その結果、どんな困ったことが起こるのか?1-4-1.コンピュータ初心者が戸惑うWindowsではほとんどの場合¥マーク、Linuxではほとんどの場合\(バックスラッシュ)、Macでは¥マークだったり、\(バックスラッシュ)だったりします。Windowsしか使わなければ問題ないですが、WEB技術はUnix/Linux由来のものが多く、\(バックスラッシュ)で表示されることもあります。その結果「何故、\になるのですか?」と言うFAQが発せられます。当ブログのようにソースを提示する時、頭痛いです。\(バックスラッシュ)になります。”&yen;”と書けば¥マークになるのですが、ソースをコピペした時、コンパイルできません。結局、フォント指定を工夫して対処してます。\(バックスラッシュ)で表示されるフォントを指定。\(バックスラッシュ)で表示されます。)1-4-2.プログラミング初心者がWindowsでC言語やC++でフォルダを扱う時ハマる¥マークはフォルダの区切り記号でもあり、エスケープ文字でも有ります。¥マーク1文字だけでは区切り記号の意味になりません。”C:¥notes”のようなフォルダを、C++で”C:¥notes”と書くと、”C:[改行]otes”と解釈されます。正しくは”C:¥¥notes”と書く必要があります。いつ頃からなのか把握していませんが、少なくとも最近のWindowsはLinuxと同じく、/(スラッシュ)をフォルダの区切り記号として受け入れます。”C:/notes”のように書いても正しくアクセスできるようです。/(スラッシュ)を使うとマルチ・プラットフォーム対応できますので、お勧めします。1-4-3.日本語フォルダ名を使う時、問題が出ることがある。細かい話は後述しますが、WindowsはShift-JISと言う文字コードで日本語を扱う機能を持ってます。std::stringやchar*で文字列を取り扱う際に日本語を使いたい場合のWindows標準です。Shift-JISは漢字1文字を2バイトで表現します。0x5cが使われている文字が多数あります。ソ、構、能、表などなどです。このような文字を使ったフォルダ名を含むパス文字列を、Shift-JISを理解しないプログラムやライブラリに与えると、その途中にある0x5cを\(バックスラッシュ)と解釈し、区切り記号として処理します。found”エラーになる場合があります。この問題は日本語を含むフォルダを使わないくらいしか対策がありません。海外製のプログラムやライブラリを使う場合は、なるべくフォルダに日本語を使わない方がトラブルが起きにくいです。最近はUnicodeが普及し滅多に見かけませんが、稀に疑わしい時があります。2.C++で取り扱う日本語文字列とその問題点2-1.文字コード文字コードとは取り扱う文字の集合とそのエンコード方式です。文字集合の全ての文字に対して、それに割り当てるコードとそのコンピュータ内部での表現方法(エンコード方式)を決めます。日本で使われる代表的な文字集合は以下の3種類です。「半角」英数記号です。日本語の全ての文字です。全ての言語の全ての文字です。全ての文字と書きましたが、日本語の全ての文字ではなく、コンピュータで取り扱う目的で定めた日本語の標準文字です。Unicodeも同様です。世界中で使われている全ての言語・全ての文字と言う意味ではありません。それぞれの文字集合に対して、大雑把にまとめると次のようなエンコード方式が決められています。UTF-32エンコード方式は文字集合も定めますので、それぞれのエンコード方式ごとに含まれる文字集合も微妙に異なります。それぞれのエンコード方式はバージョンが複数あり、細かい差異があります。UTF-32はバイトの並び順で更に細分化されています。2-2.よく使われる文字コード高度な日本語処理を行うようなプログラムではなく、各種の表示を日本語で行うような「普通」の日本語化を行うプログラムでは、次の文字コードがよく使われます。