delphi 中的 char(x) 和 C# 中的 (char)x 之间的区别

Difference between char(x) in delphi and (char)x in C#

我有一个用 Delphi 7 编码的程序并且有这个函数 char(x)(x 是变量),我需要使用 (char)x 在 C# 中编写相同的代码,但我并不总是得到相同的结果,

所以我在 Delphi 7 和 C# 中打印了所有字符 x =[1..255],我发现一些数字有所不同,这里是一些例子

[![C# 对比 Delphi 7][1]][1]

所以我想知道 Delphi 7 的 char 函数到底在做什么,这样我就可以在 C# 中做同样的事情了?

这就是我打印两个列表的方式: 在 C# 中:

for (int i = 0; i < 256; i++) 
{ richTextBox1.Text = richTextBox1.Text + " I " + i.ToString() + " " + (char)(i) + Environment.NewLine; }    

在Delphi 7:

for I := 0 to 255 do begin 
  Memo5.Text := Memo5.Text +' I='+IntToStr(I)+' char(I) '+ char(I)+#13#10; 
end;

答案是 Delphi 中的 char 使用 ANSI 代码页并在 C# 中这样做:

char[] characters = System.Text.Encoding.Default.GetChars(new byte[]{X});
char c = characters[0];

"System.Text.Encoding.Default.GetChars" 使用 ANSI 代码页 谢谢你 [1]: https://i.stack.imgur.com/yGZ8R.jpg

您使用的 C# 代码看起来像 Windows-1252 while in the Delphi code you're using some extended ASCII charset because the output on the right is actually the C1 control characters

在 ASCII 中,[0, 31] 范围内的 32 个字符称为 control characters。启用高位后,您将获得图像中 [128, 159] 范围内的字符,这是为高位控制字符保留的,因为某些旧软件无法处理 non-ASCII 字符。

Unicode 的前 256 个代码点与 ISO 8859-1 完全相同,但控制字符被省略,Windows-1252 是 ISO 8859-1 的精确超集,带有 C1 控制字符.像这样的白色圆角矩形中的字符实际上是Notepad++可视化的控制字符。输出时需要使用相同的codepage

也有可能您在编辑器中选择了错误的字符集,正如 Hans Passant 所说

C# char 类型由语言标准定义为(部分)UTF-16 字符,可能需要多个 char 实例来定义字形(您在屏幕上看到的东西).

快速 Google 搜索显示最新的 Delphi 版本将其 char 定义为宽 Unicode 字符,等同于 C++ 的 wchar_t。这与 C# 的类型不同,即使它们使用相同数量的 space.

另请注意,您的古老 Delphi 版本很可能具有古老的 1 字节 Ansi char,但我找不到它的权威规范。对于 Ansi 字符,它们到 Unicode 字形的映射由称为“代码页”的映射表决定,您可以随意切换。

在 Delphi 中,Char() 只是将序数值类型转换为 Delphi Char 类型。在Delphi7中,CharAnsiChar的别名,是一种8位字符类型。

在 C# 中,char 类型是 16 位类型,通常表示 UTF-16 编码文本的元素。

因此您可以将 Delphi 代码转换为 C# 中的 Encoding.Default.GetChars(),但这充其量只是猜测。例如,假设正在使用 ANSI 语言环境。在我看来,如果没有更多信息,就无法翻译您提供的代码。

我认为翻译代码的正确方法很可能不是按字面翻译。换句话说,您需要查看更广泛的代码以了解它执行的完整任务,而不是逐行查看。