簡體   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