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中,Char
是AnsiChar
的别名,是一种8位字符类型。
在 C# 中,char
类型是 16 位类型,通常表示 UTF-16 编码文本的元素。
因此您可以将 Delphi 代码转换为 C# 中的 Encoding.Default.GetChars()
,但这充其量只是猜测。例如,假设正在使用 ANSI 语言环境。在我看来,如果没有更多信息,就无法翻译您提供的代码。
我认为翻译代码的正确方法很可能不是按字面翻译。换句话说,您需要查看更广泛的代码以了解它执行的完整任务,而不是逐行查看。
我有一个用 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中,Char
是AnsiChar
的别名,是一种8位字符类型。
在 C# 中,char
类型是 16 位类型,通常表示 UTF-16 编码文本的元素。
因此您可以将 Delphi 代码转换为 C# 中的 Encoding.Default.GetChars()
,但这充其量只是猜测。例如,假设正在使用 ANSI 语言环境。在我看来,如果没有更多信息,就无法翻译您提供的代码。
我认为翻译代码的正确方法很可能不是按字面翻译。换句话说,您需要查看更广泛的代码以了解它执行的完整任务,而不是逐行查看。