【问题标题】:Why getline is reading my entire unicode file为什么 getline 正在读取我的整个 unicode 文件
【发布时间】:2013-12-22 02:02:05
【问题描述】:

我已经看到了很多线程,但没有一个给出的解决方案对我有用,所以如果有人能提出一些建议,那就太好了 我正在读取 unicode 文件并使用 getline 我尝试逐行扫描,但随后它会扫描整个文件,因为对象是 wstring 它不允许我在 getline 中放置分隔符。并且只询问我无法放入分隔符的 wchar_t。 (\0 不起作用,因为我正在以二进制模式阅读)所以下面是代码 sn-p 平台:Windows、Visual Studio 2010 Unicode 编码:UTF 16

wifstream fin("profiles1.prd", ios_base::binary);  //open a file
wofstream fout("DXout.txt",ios_base::binary);  // this dumps the parsing ouput
fin.imbue(std::locale(fin.getloc(),new std::codecvt_utf16<wchar_t, 0x10ffff, std::consume_header>));
fout.imbue(std::locale(fin.getloc(),new std::codecvt_utf16<wchar_t, 0x10ffff, std::consume_header>));
wstring stream;
getline(fin,stream);

【问题讨论】:

  • 文件是否包含换行符?格式正确吗?
  • @JoachimPileborg 是的文件有多行,你的意思是什么正确的格式?我有一个简单的 unicode 文本文件,里面有多行。
  • “正确格式”我的意思是你确定换行符是 UTF-16 格式,而不仅仅是普通的单字节 '\n'
  • @JoachimPileborg 是的,输入文件以 UTF 16 格式编码

标签: c++ string unicode getline


【解决方案1】:

我希望这是您正在寻找的:

fin.imbue(std::locale(fin.getloc(), new std::codecvt_utf16<wchar_t, 0x10ffff,
        std::codecvt_mode(std::little_endian|std::consume_header)>);

Windows 是 little-endian,因此要跳过 BOM utf16,您需要通过发明一种新的转换模式来彻底解决它。

希望对你有所帮助。我将写作方面留给你。

【讨论】:

    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2012-10-03
    相关资源
    最近更新 更多