代码之家  ›  专栏  ›  技术社区  ›  UncleSax

查找并用wchart替换出现

  •  0
  • UncleSax  · 技术社区  · 10 年前

    我需要开发一个小函数来查找wchar_t字符序列中的出现。该函数将指针wchart*作为字符串的输入,但由于它是unicode,因此每个字符的值显然都显示为数字。

    有没有一种优雅的方法可以做到这一点,而不需要解析字符串中的每个字母并比较unicode编号?当我试图将指针传递给函数时,这个函数只接受第一个字符,为什么?

    1 回复  |  直到 10 年前
        1
  •  0
  •   nodakai    10 年前

    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.