【问题标题】:LoadFromFile with Unicode data带有 Unicode 数据的 LoadFromFile
【发布时间】:2012-05-20 20:57:33
【问题描述】:

我的输入文件 (f) 有一些未正确读取的 Unicode(瑞典语)。

这些方法都不起作用,尽管它们给出了不同的结果:

  LoadFromFile(f);

  LoadFromFile(f,TEncoding.GetEncoding(GetOEMCP));

我正在使用 Delphi XE

我怎样才能 LoadFromFile 一些 Unicode 数据....以及我如何随后 SaveToFile?谢谢

【问题讨论】:

  • 文件的编码是什么?
  • 使用TEncoding.Default 而不是TEncoding.GetEncoding(GetOemCP)

标签: delphi delphi-xe


【解决方案1】:

为了加载一个 Unicode 文本文件,您需要知道它的编码。如果文件有字节顺序标记 (BOM),那么您只需调用 LoadFromFile(FileName),RTL 将使用 BOM 来确定编码。

如果文件没有 BOM,那么您需要明确指定编码,例如

LoadFromFile(FileName, TEncoding.UTF8);
LoadFromFile(FileName, TEncoding.Unicode);//UTF-16 LE
LoadFromFile(FileName, TEncoding.BigEndianUnicode);//UTF-16 BE

出于某种原因,我不知道,没有对 UTF-32 的内置支持,但是如果您有这样的文件,那么添加一个 TEncoding 实例来处理它就很容易了。

【讨论】:

  • 确定文件的编码似乎有问题。似乎某些 UTF8 文件没有 BOM。这似乎工作: InputData.LoadFromFile(f,TEncoding.UTF8);如果 InputData.count=0 那么 InputData.LoadFromFile(f);有没有更好的方法。我知道这个解决方案不是很优雅。
  • 读取前几个字节并检查已知的 BOM。如果没有 BOM,那么您必须知道编码。你可以做出一个很好的猜测,但它有点命中注定。
  • 有没有办法在调用 LoadFromFile 之前找出文件的编码方式?
  • @delphirules 一般来说,没有
  • @delphirules 他们并不可靠地成功。在多个文件中解释时,可以有一个有效的文件。因此,虽然您可以开发算法来预测哪种可能的有效编码是最有可能的,但概率算法会尽可能好。
【解决方案2】:

当您说“Unicode”时,我假设您的意思是“UTF-8”。

如果您知道该文件是 UTF-8,那么就这样做

LoadFromFile(f, TEncoding.UTF8).

保存:

SaveToFile(f, TEncoding.UTF8);

GetOEMCP WinAPI 函数适用于旧的 255 个字符的字符集。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多