delphi - 检测 'text' 文件类型(ANSI 与 UTF-8)

标签 delphi utf-8 delphi-7

我在 Delphi (7) 中编写了一个应用程序(心理测试考试),它创建了一个标准文本文件 - 即该文件的类型为 ANSI。

有人将该程序移植到 Internet 上运行,可能使用 Java,生成的文本文件是 UTF-8 类型。

读取这些结果文件的程序必须读取由 Delphi 创建的文件和通过 Internet 创建的文件。

虽然我可以将 UTF-8 文本转换为 ANSI(使用巧妙命名的函数 UTF8ToANSI),但我如何提前知道我拥有哪种类型的文件?

鉴于我“拥有”文件格式,我认为处理此问题的最简单方法是在文件中的已知位置放置一个标记,这将告诉我程序的来源(Delphi/Internet),但这似乎是作弊。

提前致谢。

最佳答案

没有 100% 确定的方法可以从 UTF-8 编码中识别 ANSI(例如 Windows-1250)编码。有些 ANSI 文件不能是有效的 UTF-8,但是每个有效的 UTF-8 文件也可能是不同的 ANSI 文件。 (更不用说纯 ASCII 数据,根据定义,它们都是 ANSI 和 UTF-8,但这纯粹是理论上的问题。)

例如,序列 C4 8D 可能是 UTF-8 中的“č”字符,也可能是 windows-1250 中的“䍔。两者都是可能的,也是正确的。然而,例如8D 9A 在 windows-1250 中可以是“Ťš”,但它不是有效的 UTF-8 字符串。

你必须诉诸某种启发式方法,例如

  1. 如果文件包含的序列不是有效的 UTF-8,则假定它是 ANSI。
  2. 否则,如果文件以 UTF-8 BOM (EF BB BF) 开头,则假定它是 UTF-8(可能不是,但是,以此类字符开头的纯文本 ANSI 文件的可能性很小)。
  3. 否则,假设它是 UTF-8。 (或者,尝试更多启发式方法,可能使用文本语言知识等)

另请参阅the method used by Notepad .

关于delphi - 检测 'text' 文件类型(ANSI 与 UTF-8),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4907942/

相关文章:

php - mysql_query 不返回任何内容,但可以手动使用 åæø

delphi - 分组盒 1 或 2;根据单击按钮后选择哪个复选框

delphi - 印地。使用 % 发布字符串时出错

Java 将 UTF-8 输出为真实字符?

windows - 如何从 Delphi 中的已知文件夹 GUID 获取文件夹路径

delphi - 我应该如何创建唯一的账单/帐号?

c++ - 如何将 Delphi 的 “array of string” 参数翻译成 C++?

Delphi XE 项目 'Run Parameters' 设置不会在 session 之间持续存在

delphi - 在 teechart 上的每个新点上绘制一个标记

php - json编码utf8错误