gpt4 book ai didi

c++ - 未能找到 std::wstring 中存在的 wchar_t

转载 作者:行者123 更新时间:2023-11-28 04:37:13 24 4
gpt4 key购买 nike

我在玩 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'ć') 行没有按预期表现。我没想到会得到 4 的输出,给定 std::wstring 的内存布局, 但我也 绝对没想到会得到 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"ć");
}

关于c++ - 未能找到 std::wstring 中存在的 wchar_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51064698/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com