[英]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.