测试环境:DelphiXE10.3
const
s1: ansistring = #100#200;
s2: ansistring = #100 + #200;
begin
ShowMessage(IntToStr(Ord(s1[2])));
ShowMessage(IntToStr(Ord(s2[2])));
end;
原本一直以为上面代码出来的结果应该是一样的。但是在XE10.3中测试结果却显示,第一个对话框结果为200,而第二个对话框显示为63。
经过测试验证,当使用+符号对字符进行串接时,#128(#$80)以下的字符是正常的,一旦超过#128就会溢出变成#63(#$3F)。
尚不明确是否有哪个编译指令开关可以控制这一编译器行为,目前的解决方案是不要使用+,而是全部写在一起不换行。
PS:19.12.6 补充来自Q群内大神菜根提供的解决方案
一、显性告诉编译器我们需要的是RawByteString
//原代码如下,编译后,部分字节会变成#63
Template: RawByteString = #$55#$8B#$EC#$83#$C4#$F8#$C7#$45#$F8#$21#$43#$65#$87 +
#$8B#$45#$10#$50#$8B#$4D#$0C#$8B#$55#$08#$B8#$78#$56#$34#$12#$FF#$55#$F8#$89 +
#$45#$FC#$8B#$45#$FC#$59#$59#$5D#$C2#$0C#$00;
//改为以下,显性告诉编译器,每行都是RawByteString,可以避免错误
Template: RawByteString = RawByteString(#$55#$8B#$EC#$83#$C4#$F8#$C7#$45#$F8#$21#$43#$65#$87) +
RawByteString(#$8B#$45#$10#$50#$8B#$4D#$0C#$8B#$55#$08#$B8#$78#$56#$34#$12#$FF#$55#$F8#$89) +
RawByteString(#$45#$FC#$8B#$45#$FC#$59#$59#$5D#$C2#$0C#$00);
二、将Project的CodePage设置为1252