String 为什么此字符串不包含正确的字符?

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

我的软件是用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 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-16
WideChar
表示

当转换为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-16
WideChar
表示

当转换为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-16
WideChar
表示

当转换为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-16
WideChar
表示

当转换为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