String 为什么此字符串不包含正确的字符?
我的软件是用Delphi XE3编写的,它与偶尔发送二进制数据的仪器进行通信。我本来以为我应该使用AnsiString,因为这个数据永远不会是Unicode。我不敢相信下面的代码并没有像我预期的那样工作。我想我接触的角色被认为是非法的String 为什么此字符串不包含正确的字符?,string,delphi,serial-port,delphi-xe3,String,Delphi,Serial Port,Delphi Xe3,我的软件是用Delphi XE3编写的,它与偶尔发送二进制数据的仪器进行通信。我本来以为我应该使用AnsiString,因为这个数据永远不会是Unicode。我不敢相信下面的代码并没有像我预期的那样工作。我想我接触的角色被认为是非法的 var s:AnsiString; begin s:='test' + chr(128); // had expected that since the string was set above to end in #128, // it sh
var
s:AnsiString;
begin
s:='test' + chr(128);
// had expected that since the string was set above to end in #128,
// it should end in #128...it does not.
if ord(s[5])<>128 then
ShowMessage('String ending is not as expected!');
end;
var
s:翻译;
开始
s:='test'+chr(128);
//因为上面的字符串设置为以#128结尾,
//它应该以128结尾……它不是。
如果作战需求文件[5])128,则
ShowMessage('字符串结尾不符合预期!');
结束;
当然,我可以使用指针来实现这一点,但我认为我可能应该使用另一种字符串。当然,我可以使用字节数组,但字符串更方便
真的,我想知道“为什么”,并有一些好的选择
谢谢 您观察到的行为源于这样一个事实,
Chr(128)
是一个UTF-16WideChar
表示
当转换为ANSI语言环境时,它不会映射到序号128。我希望U+0080在您的ANSI语言环境中没有等价物,因此映射到?
以指示翻译失败
事实上,编译器甚至会警告您这可能发生。使用默认编译器选项编译代码时,会产生以下警告:
W1058 Implicit string cast with potential data loss from 'string' to 'AnsiString'
W1062 Narrowing given wide string constant lost information
W1058隐式字符串转换,可能会将数据从“字符串”丢失到“AnsiString”
W1062窄化给定宽字符串常量丢失信息
就我个人而言,我会使用“配置警告”将这两个警告都视为错误
这里揭示了根本问题:
我的软件正在与偶尔发送二进制数据的仪器通信
面向字节的二进制数据的正确数据类型是字节数组。在Delphi中,这将是TBytes
使用ansisting
是错误的,因为这会使您暴露于代码页翻译。您希望能够指定序数值,并且绝对不希望文本编码发挥作用。您不希望程序的行为由当前的ANSI语言环境决定
字符串用于文本。对于二进制,使用字节数组 您观察到的行为源于这样一个事实,
Chr(128)
是一个UTF-16WideChar
表示
当转换为ANSI语言环境时,它不会映射到序号128。我希望U+0080在您的ANSI语言环境中没有等价物,因此映射到?
以指示翻译失败
事实上,编译器甚至会警告您这可能发生。使用默认编译器选项编译代码时,会产生以下警告:
W1058 Implicit string cast with potential data loss from 'string' to 'AnsiString'
W1062 Narrowing given wide string constant lost information
W1058隐式字符串转换,可能会将数据从“字符串”丢失到“AnsiString”
W1062窄化给定宽字符串常量丢失信息
就我个人而言,我会使用“配置警告”将这两个警告都视为错误
这里揭示了根本问题:
我的软件正在与偶尔发送二进制数据的仪器通信
面向字节的二进制数据的正确数据类型是字节数组。在Delphi中,这将是TBytes
使用ansisting
是错误的,因为这会使您暴露于代码页翻译。您希望能够指定序数值,并且绝对不希望文本编码发挥作用。您不希望程序的行为由当前的ANSI语言环境决定
字符串用于文本。对于二进制,使用字节数组 您观察到的行为源于这样一个事实,
Chr(128)
是一个UTF-16WideChar
表示
当转换为ANSI语言环境时,它不会映射到序号128。我希望U+0080在您的ANSI语言环境中没有等价物,因此映射到?
以指示翻译失败
事实上,编译器甚至会警告您这可能发生。使用默认编译器选项编译代码时,会产生以下警告:
W1058 Implicit string cast with potential data loss from 'string' to 'AnsiString'
W1062 Narrowing given wide string constant lost information
W1058隐式字符串转换,可能会将数据从“字符串”丢失到“AnsiString”
W1062窄化给定宽字符串常量丢失信息
就我个人而言,我会使用“配置警告”将这两个警告都视为错误
这里揭示了根本问题:
我的软件正在与偶尔发送二进制数据的仪器通信
面向字节的二进制数据的正确数据类型是字节数组。在Delphi中,这将是TBytes
使用ansisting
是错误的,因为这会使您暴露于代码页翻译。您希望能够指定序数值,并且绝对不希望文本编码发挥作用。您不希望程序的行为由当前的ANSI语言环境决定
字符串用于文本。对于二进制,使用字节数组 您观察到的行为源于这样一个事实,
Chr(128)
是一个UTF-16WideChar
表示
当转换为ANSI语言环境时,它不会映射到序号128。我希望U+0080在您的ANSI语言环境中没有等价物,因此映射到?
以指示翻译失败
事实上,编译器甚至会警告您这可能发生。使用默认编译器选项编译代码时,会产生以下警告:
W1058 Implicit string cast with potential data loss from 'string' to 'AnsiString'
W1062 Narrowing given wide string constant lost information
W1058隐式字符串转换,可能会将数据从“字符串”丢失到“AnsiString”
W1062窄化给定宽字符串常量丢失信息
就我个人而言,我会使用“配置警告”将这两个警告都视为错误
这里揭示了根本问题:
我的软件正在与偶尔发送二进制数据的仪器通信
面向字节的二进制数据的正确数据类型是字节数组。在Delphi中,这将是TBytes