jon*_*ndy 3 delphi utf-8 delphi-2007
我有一些字节流,可能编码也可能不编码为1)扩展ASCII,2)UTF-8或3)UTF-16.它们可能是英文,法文或中文.我想编写一个简单的程序,允许用户输入一个字节流,然后选择其中一个编码和一种语言,看看字符串在以这种方式解释时会是什么样子.或者简单地以9种可能的方式解释每个字符串并将它们全部显示出来.我想避免重复切换区域化.我正在使用Delphi 2007.我正在尝试做什么甚至可能?
在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.(另请参阅相关问题如何绘制Unicode文本?).
请注意:由于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函数你用于呈现文本.