[英]Failing to find a wchar_t that is present in a std::wstring
当我遇到奇怪的行为时,我正在玩std::wstring
和std::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.