【问题标题】:How to convert ANSI format file to Unicode如何将 ANSI 格式文件转换为 Unicode
【发布时间】:2012-05-06 20:27:56
【问题描述】:

我有一个以 ANSI 格式编码的文件(在 Notepad++ 中显示为 ANSI 编码),它还显示特殊字符(摄氏度、磅等),在阅读时我想将所有字符转换为 unicode。

如何在 C/C++ 或 Qt 中将 ANSI 转换为 Unicode?

【问题讨论】:

  • ANSI 编码是什么?是 ISO-Latin-1 吗?也许你可以在 Linux 上尝试iconv 命令?
  • 基本:ANSI 指的是 Windows 上的传统 8 位编码。文本文件通常不是 Unicode,而是采用这种编码,这使得它们在系统之间不太便携。它没有特定的编码,因为它随语言和区域设置而变化。不过,在美国或西欧机器上,它通常是代码页 1252。但是您可以将其设置为您喜欢的任何值。

标签: c++ qt unicode ansi


【解决方案1】:

我的 Qt 仍然很生锈,但大致如下:

QFile inFile("foo.txt");
if (!inFile.open(QIODevice::ReadOnly | QIODevice::Text))
    return;

QFile outFile("foo.out.txt");
if (!outFile.open(QIODevice::WriteOnly | QIODevice::Truncate))
    return;

QTextStream in(&inFile);
QTextStream out(&outFile);
out.setCodec("UTF-8");

while (!in.atEnd()) {
    QString line = in.readLine();
    out << line;
}

摘自QFileQTextStream 的文档,这两个文档都包含读写文件的示例。 QTextStream 的默认值是使用 legacy 编码,因此我们只需要在输出 QTextStream 上设置显式编码。

如果文件不是太大,你也可以使用

out << in.readAll();

而不是在行上循环。循环尤其可能会在输出文件中添加一个尾随换行符(尽管文档对此不是很清楚)。

【讨论】:

  • 为什么是 setCodec("UTF-8") ?默认编解码器是codecForLocale,在这种情况下恰好是正确的编解码器(“ANSI”)。
  • 因为他们想要 Unicode,而不是 ANSI。对于阅读,默认编解码器就足够了,但对于写作来说却不是。嗯,似乎我误解了这个问题,因为他们只需要一个内存表示。那么整个文件写东西就都是多余的了。
  • @MSalters 特别是如果您在 Windows 上保存文件(例如使用记事本)但需要在 Linux 上处理这些文件,则通常需要进行此类转换。
【解决方案2】:

【讨论】:

    【解决方案3】:

    只需使用QTextStream 阅读即可。它将应用QTextCodec::codecForLocale,它使用默认(“ANSI”)将 8 位字符转换为 Unicode。

    请注意,如果您将 ANSI 文本文件复制到 Mac 或 Linux,这将不起作用,因为它们没有 ANSI 的概念。对于他们来说,ANSI 文本文件将类似于 ASCII,因此您应该先转换为 Unicode (UTF-8),然后再复制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-17
      • 1970-01-01
      • 2015-04-20
      • 1970-01-01
      • 1970-01-01
      • 2017-11-29
      • 2013-02-05
      相关资源
      最近更新 更多