C++でユニコード文字列を扱う。 (この方法じゃぁだめだそうです)

wstringというクラスを使う。
代入の時にはL"xxx"とする。
cygwin ではwstringだとコンパイルできないので std::basic_stringとする.

http://www.geocities.co.jp/bleis_tift/cpp/string.html
http://others2.blog.so-net.ne.jp/2010-09-24
http://wisdom.sakura.ne.jp/programming/c/c63.html

環境変数をいじってロケールを日本語にしとく


たしかめ

$locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_ALL=

int main(){

        setlocale(LC_CTYPE,"");
        std::basic_string<wchar_t> v;
        std::string v2;

        v=L"おはよう";
        v2="おはよう";
        wcout <<L"wstring:"<<v <<L" 一文字目: "<<v[0] <<L"長さ:" <<v.length() <<L"\n";


        cout <<"string:"<<v2 <<" 一文字目: "<<v2[0] <<"長さ:" <<v2.length() <<"\n";

}

出力結果:

wstring:おはよう 一文字目: お長さ:4
string:おはよう 一文字目: ▒長さ:12

http://d.hatena.ne.jp/nagardjunas/20110524/1306231384
http://blog.livedoor.jp/love0hate/archives/1364685.html



ファイル読み込み

入力ファイル test.txt

おはようこんにちはたろう
test
たぬき

#include <iostream>
#include <locale>
#include <vector>
#include <string>
#include<stdlib.h>
#include<fstream>

using namespace std;




int main(){

        setlocale(LC_CTYPE,"");
        std::basic_string<wchar_t> str;
        std::wifstream ifs("test.txt");



        while(getline(ifs,str)){


                wcout << str <<L"3文字目:"<< str[2] <<"\n";
        }

}

おはようこんにちはたろう3文字目:よ
test3文字目:s
たぬき3文字目:き

$ cat test3.cpp

#include <iostream>
#include <locale>
#include <vector>
#include <string>
#include<stdlib.h>
#include<fstream>

using namespace std;




int main(){

        setlocale(LC_CTYPE,"");
        std::basic_string<wchar_t> str;
        std::wifstream ifs("test.txt");


        int j;
        while(getline(ifs,str)){
                j= str.find(L"こわい");

                if(j!=string::npos){

                        cout <<j<<"\n";
                }
                //wcout << str <<L"3文字目:"<< str[2] <<"\n";
        }

}