当前位置:  开发笔记 > 编程语言 > 正文

Delphi 2009 RawByteString变幻莫测

如何解决《Delphi2009RawByteString变幻莫测》经验,为你挑选了1个好方法。

假设出于某些不正当的原因,您希望显示UTF8String的原始字节内容.

var
  utf8Str : UTF8String;
begin    
  utf8Str := '€?????ó???';
end;

(1)这不行,它显示可读形式:

memo1.Lines.Add( RawByteString( utf8Str ));
// output: '€?????ó???'

(2)然而,这确实"有效" - 请注意连接:

memo1.Lines.Add( 'x' + RawByteString( utf8Str ));
// output: 'x€ąćę?‚?„???›????'

我理解(1),虽然编译器强制转换为UnicodeString似乎阻止了原样显示RawByteString var.但是,为什么行为会在(2)中发生变化?

(3)陌生人仍然 - 让我们扭转连接:

memo1.Lines.Add( RawByteString( utf8Str ) + 'x' ); 
// output: '€?????ó???x'

我一直在阅读Delphi中新奇的字符串类型,并认为我理解它们是如何工作的,但这是一个难题.



1> Barry Kelly..:

RawByteString仅存在以最小化AnsiString与具有不同代码页亲和度的各种风格的s一起工作的函数所需的重载次数.

通常,不要声明类型的变量RawByteString.不要将值类型转换为该类型.不要对该类型的变量进行连接.关于你唯一能做的事情是:

声明此类型的参数(原始意图)

索引这样的参数

在这样的参数中搜索

使用该StringCodePage功能检查字符串实际代码页的智能操作.

例如,您将注意到StringCodePage函数本身使用RawByteString其参数类型.这样,它可以与任何方法一起使用AnsiString,而不是在将其作为参数传递之前进行代码页翻译.

对于你的情况,像连接这样的东西很大程度上是不确定的.RTM和Update 2之间的行为发生了变化,但是当RTL字符串连接函数接收到具有不同代码页的多个字符串时,没有简单的方法可以找出应该用于最终字符串的代码页.这就是为什么你不应该像在这里那样连接它们的原因之一.

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有