的类型Str
与结果的类型不匹配UTF8Encode
- 所以该行Str := UTF8Encode
会损坏数据。而不是Str
你应该声明和使用具有数学结果之一的数据类型的变量Utf8Encode
。
对于参数的Str2 := UTF8Decode(Str)
错误数据类型的行也是如此。Str
它应该被另一个正确数据类型的 var 替换。
Str3
没有声明,所以代码甚至不会编译。添加Str3: WideString;
行。
ShowMessage
不适用于 UTF-16,因此您可以制作自己的弹出功能。
Tnt
制作您自己的包含unicode-aware Label的对话框以显示文本。并且您的新ShowMessage
功能将设置标签的标题,然后显示该对话框,而不是库存的 unicode-unware 一个。
您可以查看http://blog.synopse.info/post/2011/03/05/Open-Source-SynTaskDialog-unit-for-XP%2CVista%2CSeven以获取此类对话框的示例,但我不知道是否他们在 D7 上支持 UTF-16。
另一种选择是在 TnT Sources 中搜索现成的 unicode 感知功能,例如 ShowMessage - 可能有,也可能没有。
另一种选择是直接使用 Win32 API,即使用文本变量的MessageBoxW
函数:请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/ms645505.aspxPWideChar
@DavidHeffernanMessageBoxW
由于使用 C-Strings 和提供过多的灵活性,因此需要大量样板文件。它可能被认为是一个很好的替代品,MessageDlg
但对于ShowMessage
. 然后我确信 TnT 有ShowMessage
转换,并且实现自己的对话框对于应用程序的外观和主题启动体验都有好处。
您也可以从过时的 Delphi 7 切换到使用 UTF-8 开箱即用的字符串的现代 CodeTyphon。你至少应该试一试。
要使用 Delphi 7 RTL 从注册表读取和写入WideString
,您可以使用两个简单的选项:
- 将 WideString 转换为 UTF8 AnsiString 并通过保存
TRegistry.WriteString
并在读取时进行转换。
- 另存
WideString
为二进制数据:Cardinal(Length)
后跟array of WideChar
使用TRegistry.WriteBinaryData
- 您还可以使用
function RegReadWideString(const RootKey: DelphiHKEY; const Key, Name: string): WideString;
并由http://jcl.sf.netRegWriteWideString
提供
无论您选择哪种方法 - 您必须在 TRegistry 之上创建自己的类,该类将统一实现这些新方法TYourNewRegistry.WriteWideString
和TYourNewRegistry.ReadWideString
方法,以便始终使用相同的方法读回写入的字符串。
然而,既然你已经安装了 TNT - 那么仔细看看里面,。应该有现成的 unicode-aware 类TTntRegistry
或类似的东西。