Hatena::ブログ(Diary)

arupaka-_-arupakaの日記

2012-10-15

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

wstringというクラスを使う。

代入の時にはL"xxx"とする。

cygwin ではwstringだとコンパイルできないので std::basic_string<wchar_t>とする.

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";
        }

}