Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 为什么有些字符常量是1字节宽,而另一些是2字节宽?_Delphi_Delphi Xe2 - Fatal编程技术网

Delphi 为什么有些字符常量是1字节宽,而另一些是2字节宽?

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()

我以为我已经开始理解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() = 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代码页时非常笨拙和无用。