代码之家  ›  专栏  ›  技术社区  ›  Holgerwa

Delphi 2009+Unicode+字符大小

  •  6
  • Holgerwa  · 技术社区  · 17 年前

    我刚拿到Delphi2009,之前读过一些关于切换到Unicode字符串可能需要修改的文章。 大多数情况下,我们提到sizeof(char)不再保证是1。 但为什么这对于字符串操作会很有趣呢?

    例如,如果我使用一个ansisting:='test'并对一个字符串(现在是unicode)执行相同的操作,那么我会得到length()=4,这对于这两种情况都是正确的。 在没有测试它的情况下,我确信所有其他的字符串操作函数都以相同的方式运行,并在内部决定参数是Unicode字符串还是其他什么。

    如果我进行字符串操作,为什么我会对字符的实际大小感兴趣? (当然,如果我使用字符串作为字符串,而不存储任何其他数据)

    谢谢你的帮助! 霍格尔

    7 回复  |  直到 11 年前
        1
  •  5
  •   Jim McKeeth    17 年前

    用Unicode sizeof(somechar)长度(somechar) . 基本上是a的长度 一串 小于其大小的和 烧焦 S.只要你不假设 sizeof(char)=1 sizeof(somestring[x])=1 (既然两者都是 错误的 或者尝试交换 字节 带着 烧焦 S,那你就没什么麻烦了。任何你在做创意填料的地方 字节 走进 烧焦 S或 S,那么你需要使用 弦线 .

    (sizeof(somestring)仍然是4,不管长度是多少,因为它本质上是一个具有编译器魔力的指针。)

        2
  •  4
  •   community wiki Craig Stuntz    17 年前

    在旧的Delphi代码中,人们通常会隐式地将字符转换为字节,而不必真正考虑它。例如,在写入流时。将字符串写入流时,必须指定写入的字节数,但人们通常会传递字符计数。见 this post from Chris Bensen 另一个例子。

    人们进行这种隐式转换和旧代码的另一种方式是使用“字符串”存储二进制数据。在这种情况下,它们实际上需要字节,但数据类型需要字符。2009年 a better type for this .

        3
  •  1
  •   Loesje    17 年前

    我没有尝试过Delphi2009,但使用的是fpc,它也在缓慢地切换到Unicode。95%的人相信下面的所有内容都适用于Delphi2009

    在fpc中(当支持unicode时),这样“length”之类的函数就会考虑到代码页。因此,它将返回字符串的长度,就像“人类”看到的那样。例如,如果有两个中文字符,它们都占用两个字节的Unicode内存,那么长度将返回2,因为字符串中有两个字符。但字符串将占用4个字节的内存。(+引用计数和前导0的内存,但这一点除外)

    你不能再做的是:

    var p : pchar;
    begin
      p := s[1];
      for i := 0 to length(string)-1 do
        begin
        write(p);
        inc(p);
        end;      
    end;
    

    因为这段代码-在两个汉字的例子-写错了两个字符。即第一个“实数”字符的两个字节。

    简而言之:length()不再返回为字符串分配的字节数,而是返回字符数。(在切换到Unicode之前,这两个值彼此相等)

        4
  •  0
  •   1800 INFORMATION    17 年前

    除非您在字节级别进行操作,否则字符的实际大小不应该重要。

        5
  •  0
  •   Rik    17 年前

    (当然,如果我使用字符串作为字符串,而不存储任何其他数据)

    这是关键点,您不需要将字符串用于其他目的,但有些人会这样做。它们像数组一样使用字符串,所以它们(包括我)需要检查所有这些用法,以确保没有任何东西被破坏…

        6
  •  0
  •   skamradt    17 年前

    让我们不要忘记,有时这种转换并不真正需要。比如说在记录中存储一个guid。guid只能包含十六进制字符加上-和方括号…使它们占用两倍的空间会对现有代码产生很大影响。当然,简单的解决方案是将它们更改为ansistring,并在对它们进行任何字符串操作时处理编译器警告。

        7
  •  0
  •   Rohit Gupta    11 年前

    如果您调用Windows API,这可能是一个问题。或者如果你有传统的代码 股份有限公司 12月 属于 STR〔0〕 改变它的长度。