delphi – 将AnsiString转换为Unicode字符串
发布时间:2020-12-15 09:27:33 所属栏目:大数据 来源:网络整理
导读:我正在将D2006程序转换为D2010.我的数据库中每个字符串都有一个存储在单个字节中的值,我需要将其加载到具有LoadFromStream的控件中,因此我的计划是将字符串写入流并将其与LoadFromStream一起使用.但它没有用.在研究这个问题时,我看到一个问题告诉我,我真的不
我正在将D2006程序转换为D2010.我的数据库中每个字符串都有一个存储在单个字节中的值,我需要将其加载到具有LoadFromStream的控件中,因此我的计划是将字符串写入流并将其与LoadFromStream一起使用.但它没有用.在研究这个问题时,我看到一个问题告诉我,我真的不明白从AnsiString到Unicode字符串的转换是如何工作的.这是一段独立的代码,说明了我感到困惑的问题:
procedure TForm1.Button1Click(Sender: TObject); {$O-} var sBuffer: String; oStringStream: TStringStream; sAnsiString: AnsiString; sUnicodeString: String; iSize1,iSize2: Word; begin sAnsiString := '12345'; oStringStream := TStringStream.Create(sBuffer); sUnicodeString := sAnsiString; iSize1 := StringElementSize(sAnsiString); iSize2 := StringElementSize(sUnicodeString); oStringStream.WriteString(sUnicodeString); end; 如果你在最后一行中断,并检查oStringStream的Bytes属性,你会看到它看起来像这样: Bytes (49 {$31},50 {$32},51 {$33},52 {$34},53 {$35} 我期待它可能看起来像 (49 {$31},00 {$00},53 {$35},00 {$00} ... 显然我的期望是错误的.但是,如何将AnsiString转换为unicode? 我没有从LoadFromStream中获得正确的结果,因为它一次从流中读取两个字节,但它接收的数据不是那样排列的.我应该做些什么来为LoadFromStream提供基于unicode字符串的良好数据流? 谢谢您的帮助. 解决方法
oStringStream.WriteString的参数是什么类型的?如果它是AnsiString,你有一个从Unicode到Ansi的隐式转换,这解释了你的例子.
更新:现在真正的问题是TStringStream如何在内部存储数据. procedure TForm1.Button1Click(Sender: TObject); var S: string; SS: TStringStream; begin S:= 'asdfg'; SS:= TStringStream.Create(S); // 1 byte per char SS.WriteString('321'); Label1.Caption:= SS.DataString; SS.Free; end; TStringStream在内部使用默认的系统ANSI编码(每个字符1个字节). 要覆盖此行为,您必须在构造函数中明确声明编码: procedure TForm1.Button1Click(Sender: TObject); var S: string; SS: TStringStream; begin S:= 'asdfg'; SS:= TStringStream.Create(S,TEncoding.Unicode); // 2 bytes per char SS.WriteString('321'); Label1.Caption:= SS.DataString; SS.Free; end; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |