質問: おはようございます。私はC++を用いて開発をしています。今、日本語の文字列をstring型で受取り、それ各文字ごとに切り抜いて数を数えるプログラムを作成しているのですが、日本語を扱ったのは始めてなので知見が足りません、できればstringにrange_based_forを書けたときのようにスラスラ取りたいです。どのように記述すればよいですか。
回答: C/C++言語規格上はリテラルを除けば「文字列」という概念は無いに等しく 「文字コードを意味する型」の「配列」しかありません。 また、ANSI(Shift-JIS)(別名:MBCS)系コードと、Unicode系コードで扱いが異なります。 ``` char Nihongo_A[7] = "日本語"; // char配列に日本語を入れてみた(Shif-JISコードの場合) wchar_t Nihongo_W[4] = L"日本語"; // ワイド文字の配列にUnicodeの日本語を入れてみた(UTF-16等の場合) ``` どちらも日本語を扱ってますが「1文字の概念」が文字コードによって異なるので、上記のように配列に必要な要素数が異なるわけですね。 例外を除けばwchar_t型は1文字を意味しますので配列インデックスを指定して1文字を判定できます。 ``` if( Nihongo_W[1]==L'本'){ // '本'でした } ``` もちろん基本型の配列には Range-based for は使えますし、 ``` for( wchar_t & jc : Nihongo_W){// jc = L'あ';//全部'あ'にする } ``` または、その機能を持っているより高度な「文字列クラス」もあるのでそれを使用すれば良いわけですね。