如何在Delphi 7中获取日语字符

3

我在我的Delphi应用程序中遇到了显示日语字符的问题,具体来说是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 中获取正确的名称。那么如何从字符串中提取名称?

我不想显示文本,但我想将其用于保存到注册表和其他函数。

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

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

谢谢!


http://objectmix.com/delphi/401792-does-d7-support-japanese-chinese.html - Hidden
顺便问一下,为什么不使用支持UTF8的CodeTyphon而不是过时的D7? - Arioch 'The
好的,你要使用widestring工作,例如Str3 := Str + Str2。这就是在处理字符串。或者提出更具体的问题。例如,对于将它们保存到注册表中,我已经在答案中给出了4个选项,对于ShowMessages也是如此。没有所谓的“只是工作”,这个问题无法回答。 - Arioch 'The
@Super_User 如果您不再使用ShowMessage,请将其从代码中删除,它会造成明显的误导。并修复或删除对UTF8**code函数的使用。 - Arioch 'The
根据文件类型和内部结构,“将字符串写入文件”有很大的不同。这个文件是Firebird SQL服务器的数据库吗?还是电子邮件文件?或者是ini文件?或者其他什么类型的文件? - Arioch 'The
此外,请查看http://wiki.delphi-jedi.org/wiki/JCL_Help:JclWideStrings.pas。 - Arioch 'The
1个回答

2
Str的类型与UTF8Encode的结果类型不匹配,所以Str := UTF8Encode这行代码会破坏数据。你应该声明并使用与Utf8Encode结果数据类型相匹配的变量来代替Str
对于Str2 := UTF8Decode(Str)这行代码同样也是由于Str参数类型错误导致的。应该用一个合适的数据类型来替换它。 Str3没有被声明,所以此代码甚至无法编译。添加Str3: WideString;这一行。
ShowMessage 不支持 UTF-16,所以你需要自己制作一个可以工作的弹出窗口函数。
创建一个包含 Tnt Unicode-Aware 标签的对话框来显示文本。你新建的类似于 ShowMessage 的函数将设置标签的标题,然后显示该对话框,而不是默认的不支持Unicode的弹出窗口。 你可以参考http://blog.synopse.info/post/2011/03/05/Open-Source-SynTaskDialog-unit-for-XP%2CVista%2CSeven来制作这种对话框,但我不确定它们在 D7 上是否支持 UTF-16。 另一种选择是在 TnT 源代码中查找一个已经制作好的类似于 ShowMessage 的 Unicode-Aware 函数 - 可能有,也可能没有。
还有一种选择是直接使用 Win32 API,即使用PWideChar变量来处理文本,其中包括 MessageBoxW 函数。详见http://msdn.microsoft.com/en-us/library/windows/desktop/ms645505.aspx@DavidHeffernan MessageBoxW需要很多样板代码,因为它使用 C 字符串并提供了太多的灵活性。它可以被认为是 MessageDlg 的良好替代品,但不能完全替代 ShowMessage。 我确信 TnT 有 ShowMessage 的转换,并且自己实现对话框既能提高应用程序的外观和感受,也能提高主题发起者的体验。 你还可以将过时的 Delphi 7 切换到现代的 CodeTyphon 中,后者默认使用 UTF-8 进行字符串编码。你至少应该试一试。
要使用 Delphi 7 RTL 从注册表中读取和写入WideString,可以采取两种简单的方法:
  1. 将WideString转换为UTF8 AnsiString并通过TRegistry.WriteString进行保存,读取时进行反向转换。
  2. WideString保存为二进制数据:Cardinal(Length)后跟随array of WideChar,使用TRegistry.WriteBinaryData
  3. 您还可以使用http://jcl.sf.net提供的RegReadWideString(const RootKey: DelphiHKEY; const Key, Name: string): WideString;RegWriteWideString函数。

无论选择哪种方法,您都需要在TRegistry之上自己编写一个类,该类统一实现这些新的TYourNewRegistry.WriteWideStringTYourNewRegistry.ReadWideString方法,以便始终使用相同的方法读取写入的字符串。

然而,由于您已经安装了TNT - 那么请仔细查看,里面应该有现成的Unicode感知类,如TTntRegistry或类似的东西。


我已经添加了Str3的声明,并且我也更新了我的问题。我不想仅仅显示文本,我想进一步处理这个字符串。 - Super_User

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接