美文网首页
C++读取UTF-8问题(使用

C++读取UTF-8问题(使用

作者: 寽虎非虫003 | 来源:发表于2020-04-14 04:37 被阅读0次

    C++读取UTF-8问题(使用<codecvt>)

    问题来源于最近参加的一个比赛,要求输入输出必须为utf-8格式,而我因为运算速度的原因选择了使用C++作为编程语言,所以就面对了这个问题。目前这个问题还未完全解决,阶段性的记录这个过程。

    查到的关于<codecvt>的方法来自于来源

    经过测试,该方法能够得到正确的字符串信息。

    第一个示例

    如下:

    #include <sstream>
    #include <fstream>
    #include <codecvt>
    
    std::wstring readFile(const char* filename)
    {
        std::wifstream wif(filename);
        wif.imbue(std::locale(std::locale::empty(), new std::codecvt_utf8<wchar_t>));
        std::wstringstream wss;
        wss << wif.rdbuf();
        return wss.str();
    }
    

    调用方式如下:

    std::wstring wstr = readFile("a.txt");
    

    暂时还没太搞明白这当中各个函数的作用。

    第二个示例,复杂了一些

    依旧是用<codecvt>,但是加入了<locale>

    #include <locale>
    #include <codecvt>
    #include <string>
    #include <fstream>
    #include <cstdlib>
    
    int main()
     {
        const std::locale empty_locale = std::locale::empty();
        typedef std::codecvt_utf8<wchar_t> converter_type;
        const converter_type* converter = new converter_type;
        const std::locale utf8_locale = std::locale(empty_locale, converter);
        std::wifstream stream(L"test.txt");
        stream.imbue(utf8_locale);
        std::wstring line;
        std::getline(stream, line);
        std::system("pause");
    }
    

    wstringstream的清空

    和stringstream的清空一样,使用 .clear()函数和 .str("") 进行清空,只不过wstringstream的是 .str(L"")。参考清空std::stringstream,联系到stream的clear()和清空

    #include <cstdlib>
    #include <iostream>
    #include <sstream>
    #include <codecvt>
    
    using namespace std;
    
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    
    int main(int argc, char * argv[])
    {
       std::wstringstream stream;
       wstring wstr;
    
        while(1)
        {    
            //clear(),这个名字让很多人想当然地认为它会清除流的内容。
            //实际上,它并不清空任何内容,它只是重置了流的状态标志而已!
            wstream.clear();   
    
           // 清空wstringstream的缓冲,每次循环内存消耗将不再增加!
           stream.str(L"");      
    
            wstream<<L"sdfsdfdsfsadfsdafsdfsdgsdgsdgsadgdsgsdagasdgsdagsadgsdgsgdsagsadgs ";
           wstream>>wstr;    
    
          }
    
        system("PAUSE ");
        return EXIT_SUCCESS;
    
    }
    

    接下来

    接下来我应该会在这两个版本的基础上去尝试解析我的文件。

    相关文章

      网友评论

          本文标题:C++读取UTF-8问题(使用

          本文链接:https://www.haomeiwen.com/subject/kecvyctx.html