【问题标题】:Reading file with cyrillic用西里尔字母读取文件
【发布时间】:2010-02-16 22:08:16
【问题描述】:

我必须用西里尔符号打开文件。我已将文件编码为 utf8。示例如下:

zh:你的家人买不起 适合你的服装
ru: Не ваша семья позволить себе костюм для вас

如何打开文件:

ifstream readFile(fileData.c_str());
while (!readFile.eof())
{
  std::getline(readFile, buffer);
  ...
}

第一个麻烦,文本'en'之前有一些符号(我在调试器中看到了这个):

"zh: 最少"

另一个麻烦是西里尔符号:

" ru: наименьший"

怎么了?

【问题讨论】:

    标签: c++ encoding


    【解决方案1】:

    文本'en'之前有一些符号

    这是一个人造 BOM,将 U+FEFF BYTE ORDER MARK 字符编码为 UTF-8 的结果。

    由于 UTF-8 是一种没有字节顺序的编码,因此不应使用仿 BOM,但不幸的是,相当多的现有软件(尤其是在 MS 世界中)仍然可以使用。将消息文件加载到文本编辑器中,然后将其再次保存为 UTF-8,如果特别列出,则使用“不带 BOM 的 UTF-8”编码。

    ru: наименьший

    当您有一个 UTF-8 字节字符串(表示 наименьший)并将其打印为 Code Page 1252(Windows 西欧)字节字符串时,您会得到这样的结果。这不是输入问题;您已读取字符串 OK 并具有 UTF-8 字节字符串。但是,在您没有引用的代码中,它的输出为 cp1252。

    如果您只是将其打印到控制台,这是意料之中的,因为控制台始终使用系统默认代码页(在西方 Windows 安装上为 1252),而不是 UTF-8。如果您需要将 Unicode 发送到控制台,则必须将字节转换为原生 Unicode wchars 并从那里写入。我不知道你的字符串的最终目的地是什么......如果你只是要将它们写入另一个文件或其他东西,你可以将它们保留为字节而不关心它们的编码。

    【讨论】:

      【解决方案2】:

      我想你的操作系统是 windows。存在几种简单的方式:

      1. 使用 wchar_t、wstring、wifstream 等
      2. 使用 icu 库
      3. 使用其他超级 puper 库(它们真的很多)

      注意:对于控制台打印,您必须使用 WinApi 函数将 UTF-8 转换为 cp866(我的默认 cyrilic windows 编码 cp1251),因为 windows 控制台仅支持 dos 编码。

      注意:对于文件打印,您需要知道文件使用什么编码

      【讨论】:

        【解决方案3】:

        阅读后使用libiconv将文本转换为可用的编码。

        【讨论】:

          【解决方案4】:

          使用icu 转换文本。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-06-10
            • 1970-01-01
            • 2017-10-27
            • 1970-01-01
            • 1970-01-01
            • 2019-06-13
            • 1970-01-01
            • 2017-09-10
            相关资源
            最近更新 更多