3

我在 delphi 应用程序中显示 Japanese Character 时遇到问题,特别是 Unicode 字符“5c”。我需要将应用程序名称保存到注册表中,然后在某种弹出窗口中显示它。

我已将问题专门缩小到此代码:-

  Var
   Str : WideString;
   Str2: WideString;
   Str3 : WideString; 
 TntEdit5.Text := TntOpenDialog1.FileName; //correctly displayed

 Str3 := TntEdit5.Text;

 ShowMessage('Original =' + Str3);

 Str := UTF8Encode(TntEdit5.Text) ;
 ShowMessage('UTF8Encode =' + Str3);


 Str2 := UTF8Decode(Str) ;
 ShowMessage('UTF8Decode =' + Str3);
 end;

我在 Str、Str2 和 Str3 中没有得到正确的名称。那么如何获取字符串中的名称呢?我不想显示文本,但我想用它来保存到注册表和其他功能。

而不是 SHowMessage,我使用MessageBoxW(Form1.Handle, PWChar( Str3 ), 'Path', MB_OK );了它给了我正确的结果。

但我想在内部使用这个字符串,比如将字符串写入文件等。怎么做?

提前致谢

4

1 回答 1

2

的类型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,您可以使用两个简单的选项:

  1. 将 WideString 转换为 UTF8 AnsiString 并通过保存TRegistry.WriteString并在读取时进行转换。
  2. 另存WideString为二进制数据:Cardinal(Length)后跟array of WideChar使用TRegistry.WriteBinaryData
  3. 您还可以使用function RegReadWideString(const RootKey: DelphiHKEY; const Key, Name: string): WideString;并由http://jcl.sf.netRegWriteWideString提供

无论您选择哪种方法 - 您必须在 TRegistry 之上创建自己的类,该类将统一实现这些新方法TYourNewRegistry.WriteWideStringTYourNewRegistry.ReadWideString方法,以便始终使用相同的方法读回写入的字符串。

然而,既然你已经安装了 TNT - 那么仔细看看里面,。应该有现成的 unicode-aware 类TTntRegistry或类似的东西。

于 2013-07-24T08:26:10.157 回答