gpt4 book ai didi

Delphi 2009 RawByteString 变幻莫测

转载 作者:行者123 更新时间:2023-12-03 15:07:22 25 4
gpt4 key购买 nike

假设由于某种不正当的原因,您想要显示 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 中新奇的字符串类型,并认为我理解它们是如何工作的,但这是一个难题。

最佳答案

RawByteString 的存在只是为了最大限度地减少与具有不同代码页亲和性的各种 AnsiString 一起使用的函数所需的重载数量。

一般情况下,不要声明 RawByteString 类型的变量。不要将值类型转换为该类型。不要对该类型的变量进行串联。您唯一能做的事情是:

  • 声明该类型的参数(初衷)
  • 为此类参数建立索引
  • 在这样的参数中搜索
  • 使用 StringCodePage 函数检查字符串的实际代码页的智能操作。

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

对于您的情况,诸如串联之类的东西很大程度上是未定义的。 RTM 和 Update 2 之间的行为发生了变化,但是当 RTL 字符串串联函数接收具有不同代码页的多个字符串时,没有简单的方法可以确定最终字符串应使用什么代码页。这只是您不应该像此处那样连接它们的原因之一。

关于Delphi 2009 RawByteString 变幻莫测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/498315/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com