如何在Delphi XE4中将AnsiString转换为UnicodeString

3
exzample code:
var
  str1 : String;
  str2 : AnsiString;
  ....
  str2 := ....;
  str1 := String(str2);  

我转换了类似上面的代码,但是它没有生效。我发现在str1中有些数据丢失了。有没有一种安全的方法将AnsiString转换为UnicodeString?


这是可行的正确方式...您需要更具体地提供示例。您的输入是什么,您得到了什么输出(或者您感觉自己失去了什么)。 - TLama
在分配str2的过程中,也有可能已经发生了损失。 - Uwe Raabe
正确的方式,可以避免编译器警告,是使用显式类型转换:str1 := UnicodeString(str2); 你需要更详细地解释为什么认为有数据丢失。Writeln(length(str1),length(str2):20); if length(str1) = length(str2) then for I := 1 to length(str1) do writeln( str1[i] =str2[i]) ; 然后查看是否报告了 False。 - Arioch 'The
@Arioch'The 你的比较循环相当幼稚,对于所有映射到Unicode页面0的字形以外的Win-1252代码页都无法工作。 - Arnaud Bouchez
它也适用于win866的西里尔字母。@arnaudbouchez - Arioch 'The
1个回答

5
你的代码已经正确。它将从ANSI转换为UTF-16,不会丢失任何信息。
因此,我得出结论,当您分配给AnsiString变量时,信息会丢失。换句话说,您的代码中的错误包含在您代码的....部分中。
错误可能是您的AnsiString变量的数据和代码页不匹配。

1
我相信这是你所问问题的答案,但你可能不会满意。也许你问错了问题。我怀疑你应该提供一个SSCCE,并询问为什么字符串转换的行为对你来说是意外的。这样的问题很容易回答,肯定能解决你真正的问题。当然,那将是一个完全不同的问题。 - David Heffernan
1
啊,原来是这个问题。不要将二进制数据读入文本数据类型中。而且,在多个字符编码之间进行转换时,绝对不能期望出现合理的结果。使用zip库来读取zip文件。如果必须自己加载数据,请使用像TBytes这样的二进制安全数据类型。 - Rob Kennedy
@taoxl请展示一下你从zip文件中提取str2的代码。或者如果你的意思是将zip文件读入字符串变量-那是一个“设计上的错误”想法,应该将zip文件读入TBytesTMemoryStream或其他原始二进制容器中。 - Arioch 'The

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