我有一些字节流可能编码也可能不编码为1)扩展ASCII,2)UTF-8或3)UTF-16。它们可能是英文,法文或中文。我想编写一个简单的程序,允许用户输入一个字节流,然后选择其中一个编码和一种语言,看看字符串在以这种方式解释时会是什么样子。或者简单地以9种可能的方式解释每个字符串并将它们全部显示出来。我想避免重复切换区域化。我正在使用Delphi 2007.我正在尝试做什么呢?
答案 0 :(得分:7)
在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)
除非您想要/需要使用特定字体,否则请在列表中选择您要使用的语言变体 first 字体,因为这些是标准字体(在XP上,您将需要在可用之前启用东亚语言支持,在Vista及以上版本中,它们总是包括在内)。如果你不这样做,那么Windows可能根本不渲染字符(显示缺少的字符字形),或者它可能使用不适当的后备(例如PMingLiu为简体中文) - 确切的行为取决于用于呈现文本的API函数。