std::wstring
和
std::wstream
如果
locale
正确设置:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
static void searchAndReport(const wstring &line) {
wstring::size_type pos = line.find(L"ãª"); // hiragana "na"
if (wstring::npos == pos) {
wcout << L"è¦ã¤ããã¾ãã" << endl; // not found
return;
}
for (bool first = true; wstring::npos != pos; pos = line.find(L"ãª", pos + 1)) {
if (first)
first = false;
else
wcout << L", " ;
wcout << L"第" << pos << L"æ¡" ; // the pos-th column
}
wcout << endl;
}
static void readLoop(wistream &is) {
wstring line;
for (int cnt = 0; getline(is, line); ++cnt) {
wcout << L"第" << cnt << L"è¡ç®: " ; // the cnt-th line:
searchAndReport(line);
}
}
int main(int argc, char *argv[]) {
// locale::global(std::locale("ja_JP.UTF-8"));
locale::global(std::locale(""));
if (1 < argc) {
wcout << L"å
¥åãã¡ã¤ã«: [" << argv[1] << "]" << endl; // input file
wifstream ifs( argv[1] );
readLoop(ifs);
} else {
wcout << L"æ¨æºå
¥åã使ç¨ãã¾ã" << endl; // using the standard input
readLoop(wcin);
}
}
成绩单:
$ cat scenery-by-bocho-yamamura.txt
ãã¡ããã®ãªã®ã¯ãª
ãã¡ããã®ãªã®ã¯ãª
ãã¡ããã®ãªã®ã¯ãª
ãã¡ããã®ãªã®ã¯ãª
ãã¡ããã®ãªã®ã¯ãª
ãã¡ããã®ãªã®ã¯ãª
ãã¡ããã®ãªã®ã¯ãª
ããããªãããã¶ã
ãã¡ããã®ãªã®ã¯ãª
$ ./wchar_find scenery-by-bocho-yamamura.txt
å
¥åãã¡ã¤ã«: [scenery-by-bocho-yamamura.txt]
第0è¡ç®: 第5æ¡, 第8æ¡
第1è¡ç®: 第5æ¡, 第8æ¡
第2è¡ç®: 第5æ¡, 第8æ¡
第3è¡ç®: 第5æ¡, 第8æ¡
第4è¡ç®: 第5æ¡, 第8æ¡
第5è¡ç®: 第5æ¡, 第8æ¡
第6è¡ç®: 第5æ¡, 第8æ¡
第7è¡ç®: 第3æ¡
第8è¡ç®: 第5æ¡, 第8æ¡
所有文件都是UTF-8格式。
小心不要混合
cout
和
wcout
:
环境:
$ lsb_release -a
LSB Version: core-2.0-amd64: [...snip...]
Distributor ID: Ubuntu
Description: Ubuntu 12.04.5 LTS
Release: 12.04
Codename: precise
$ env | grep -i ja
LANGUAGE=ja:en
GDM_LANG=ja
LANG=ja_JP.UTF-8
$ g++ --version
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.