代码之家  ›  专栏  ›  技术社区  ›  Marek Jedliński

Delphi 2009 RawByteString变幻莫测

  •  5
  • Marek Jedliński  · 技术社区  · 16 年前

    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)中的行为会改变?

    更奇怪的是——让我们颠倒一下连接:

    memo1.Lines.Add( RawByteString( utf8Str ) + 'x' ); 
    // output: '€ąćęłńóśźżx'
    

    2 回复  |  直到 16 年前
        1
  •  9
  •   Barry Kelly    16 年前

    RawByteString 只存在于最小化与各种风格的函数一起工作所需的重载数量 AnsiString 它们具有不同的代码页亲和力。

    一般来说,不要声明类型为的变量

    • 对此类参数进行索引
    • 在这样的参数中搜索
    • 使用以下方法检查字符串的实际代码页的智能操作 StringCodePage 功能。

    例如,您会注意到 函数本身使用 作为其参数类型。这样,它将与任何 ,而不是在将其作为论点传递之前进行代码页翻译。

    对于你的情况,像连接这样的事情在很大程度上是未定义的。RTM和Update 2之间的行为发生了变化,但当RTL字符串连接函数接收到具有不同代码页的多个字符串时,它很难找出应该为最终字符串使用哪个代码页。这只是你不应该像在这里这样连接它们的一个原因。

        2
  •  1
  •   Jan Goyvaerts    16 年前

    您不能“按原样”向TMemo添加字符串。你总是需要进行某种形式的Unicode转换,因为TMemo在Delphi 2009中只知道这些。

    如果你想假装你的UTF8String使用代码页1252,请这样做:

    var
      utf8Str : UTF8String;
      Raw: RawByteString;
    begin
      utf8Str := '€ąćęłńóśźż';
      Raw := utf8Str;
      SetCodePage(Raw, 1252, False);
      Memo.Lines.Add(Raw);
    end;
    

    有关更多详细信息,请参阅我的文章 Using RawByteString Effectively

    推荐文章