Delphi 为什么有些字符常量是1字节宽,而另一些是2字节宽?
我以为我已经开始理解Unicode了,但这让我不知所措:Delphi 为什么有些字符常量是1字节宽,而另一些是2字节宽?,delphi,delphi-xe2,Delphi,Delphi Xe2,我以为我已经开始理解Unicode了,但这让我不知所措: const c1 = #1; --> SizeOf() = 2 c2 = #33; --> SizeOf() = 2 c3 = #127; --> SizeOf() = 2 c4 = #128; --> SizeOf() = 1 c5 = #160; --> SizeOf() = 1 c6 = #161; --> SizeOf() = 1 c7 = #255; --> SizeOf()
const
c1 = #1; --> SizeOf() = 2
c2 = #33; --> SizeOf() = 2
c3 = #127; --> SizeOf() = 2
c4 = #128; --> SizeOf() = 1
c5 = #160; --> SizeOf() = 1
c6 = #161; --> SizeOf() = 1
c7 = #255; --> SizeOf() = 1
有人能解释一下吗?
Delphi XE2,默认Windows-1252代码页
谢谢
Jan这是有文档记录的-请参阅指令@DavidHeffernan我认为这是为了使用前Unicode代码,使#160与D2007和更早版本中的字符相同。@DavidHeffernan-这一功能很奇怪,但一致。可能是出于兼容性原因,同样的原因导致了
AnsiUpperCase
在Delphi 2009中成为unicode函数。@Serg Marco Cantu的书证实了您所说的这背后的原因。EMBT应该将$HIGHCHARUNICODE=设置为默认值。我知道它的存在,但没有看,假设一致的行为作为标准,编译器指令用于异常(例如向后兼容性)@Jan即使不是2009年的,现在也应该是默认的!也请注意gotcha@Arioch我想知道如何修复这个“bug”,因为这就是Unicode在Delphi中的实现方式;Ord(Ch)通常取决于默认的ANSI代码页;在具有不同ANSI代码页的系统上编译时,可以获得不同的二进制文件。@Serg默认值是哪个?在同一个项目中,我们可以在至少三个不同的代码页中编码源…----我个人认为,如果可能的话,Ord(WideChat)应该映射到UTF-16单词。如果可能,Ord(AnsiChar)应该映射到GetACP()字节。分别有Chr(Byte):AnsiChar和Chr(Word):WideChar;我不知道如何处理MBCS和Unicode代理,但希望这是罕见的beast;问题是,当您使用Ansi字符时,同时启用和禁用{$HIGHCHARUNICODE},因为正如Marian在Delphi中所说的Ansi
,这意味着特定于语言环境,并且在需要支持多个Ansi代码页时非常笨拙和无用。