我有一些字节流可能会或可能不会被编码为 1) 扩展 ASCII、2) UTF-8 或 3) UTF-16。它们可能是英文、法文或中文的。我想编写一个简单的程序,允许用户输入一个字节流,然后选择一种编码和一种语言,看看以这种方式解释字符串会是什么样子。或者简单地以 9 种可能的方式解释每个字符串并将它们全部显示出来。我想避免不得不反复切换区域化。我正在使用 Delphi 2007。我想要做的甚至可能吗?
1 回答
在 Delphi 2009 或更高版本中,这会更容易,因为它支持 Unicode 并且可以透明地完成大部分操作。对于旧版本,您必须做更多的手动工作。
您要做的第一件事是将文本转换为通用代码页;最好是 UTF-16,因为那是 Windows 上的本机代码页。为此,您使用MultiByteToWideChar函数。对于 UTF-8 到 UTF-16,语言无关紧要;对于“扩展 ASCII”,您需要选择适当的源代码页(例如 Windows-1252 用于英语和法语,以及 GB2312 或 Big5 或其他一些中文代码页 - 这取决于您希望收到的内容)。要存储这些,您可以使用 WideString,它直接存储 UTF-16。
一旦你有了它,你必须以某种方式绘制文本——这需要你要么获得一个支持 Unicode 的控件(一个标签可能就足够了),要么写一个,或者直接调用适当的 Windows API 函数来绘制 - 和这就是它可能会变得有点混乱的地方,因为有几个函数可以做到这一点。TextOutW可能是这里最简单的选择,但另一个选择是DrawText。确保显式调用这些函数的 W 版本以便使用 Unicode。(另请参阅相关问题How do I draw Unicode text?)。
请注意:由于 CJK 统一 - 在 Unicode 的相同代码点处对等价的中文汉字、日文汉字和韩文汉字字符的编码 - 您需要选择一种与预期的中文(繁体或简体)相匹配的字体,以便获得预期的渲染。引用Michael Kaplan的一篇相关文章:
归根结底,有许多角色可以有四种不同的外观:
- 日语将默认使用 MS UI Gothic(回退到 PMingLIU,然后是 SimSun,然后是 Gulim)
- 韩语将默认使用 Gulim(回退到 PMingLiu,然后是 MS UI Gothic,然后是 SimSun)
- 简体中文将默认使用 SimSun(回退到 PMingLiu,然后是 MS UI Gothic,然后是 Batang)
- 繁体中文将默认使用 PMingLiu(回退到 SimSun,然后是 MS Mincho,然后是 Batang)
除非您有想要/需要使用的特定字体,否则请为您想要使用的语言变体选择列表中的第一个字体,因为这些是标准字体(在 XP 上,您需要先启用东亚语言支持,然后再启用它们可用,在 Vista 及更高版本上,它们始终包含在内)。如果您不这样做,那么 Windows 可能根本不呈现字符(而是显示丢失的字符字形),或者它可能使用不适当的回退(例如 PMingLiu 用于简体中文) - 确切的行为取决于您使用的 API 函数用于渲染文本。