繁体   English   中英

找不到std :: wstring中存在的wchar_t

[英]Failing to find a wchar_t that is present in a std::wstring

当我遇到奇怪的行为时,我正在玩std::wstringstd::wfstream 即,似乎std::basic_string<wchar_t>::find无法找到某些字符。 考虑以下代码:

int main()
{
    std::wifstream input("input.txt");
    std::wofstream output("output.txt");

    if(!(input && output)){
        std::cerr << "file(s) not opened";
        return -1;
    }

    std::wstring buf;
    std::getline(input, buf);

    output << buf;

    std::cout << buf.find(L'ć');
}

在这里,我只是读取input文件的第一行并将其写入output文件。 在程序运行之前,第一个文件的内容为aąbcćd ,输出文件为空。 执行代码后,输入文件成功复制到输出文件中。

令我惊讶的是,我试图在buf找到一个ć字母,并遇到了所提到的奇怪行为。 程序执行后,我确认输出文件恰好包含aąbcćd ,其中显然包含提到的字符ć

但是,行std::cout << buf.find(L'ć')行为不符合预期。 考虑到std::wstring的内存布局,我并不期望得到4的输出,但是我也绝对不希望得到std::string::npos 值得一提的是,使用此方法查找常规ASCII字符成功。

综上所述,上述代码正确地将输入文件的第一行复制到输出文件,但是未能在字符串中找到一个字符(返回npos),该字符负责保存要复制的数据。 为什么会这样? 是什么导致find失败?

注意:两个文件在Windows上都是UTF-8编码的。

不幸的是, wchar_t不是UTF-8,也不是UTF-16(在Windows上),并且在读取UTF-8文件时不会发生魔术转换。 如果调试程序,则会在buf变量中看到损坏的字符。

您要么需要以std::string读取字符串,然后将其从UTF-8转换为whar_t要么在UTF-8中工作,并将原义字符串从whcar_t转换为UTF-8字符的std::string

如果使用的是最新的编译器,则可以使用以下命令创建UTF-8字符串文字:

u8"ć"

以下应该工作:

int main()
{
    std::ifstream input("input.txt");
    std::ofstream output("output.txt");

    if(!(input && output)){
        std::cerr << "file(s) not opened";
        return -1;
    }

    std::string buf;
    std::getline(input, buf);

    output << buf;

    std::cout << buf.find(u8"ć");
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM