найти и заменить вхождение на wchar_t

Мне нужно разработать небольшую функцию, чтобы найти вхождение в последовательность символов wchar_t. эта функция принимает в качестве входных данных указатель wchar_t * на строку, но, поскольку она в юникоде, значение каждого отдельного символа, очевидно, отображается в виде числа.

Есть ли элегантный способ сделать это без разбора каждой буквы в строке и сравнения номера юникода? Кроме того, когда я пытаюсь передать указатель на функцию, этот принимает только первый символ, почему?

0

Решение

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.
0

Другие решения


По вопросам рекламы [email protected]