You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Delphi 7 Char(x)与C# (char)x差异及等效实现咨询

Delphi 7 Char(x) vs C# (char)x: 差异原因及等效实现

问题背景

我之前遇到过一模一样的问题:把Delphi 7里用Char(x)实现的逻辑转成C#的(char)x后,结果总是对不上。后来遍历x从0到255对比输出,才发现确实有部分数值对应的字符差异明显,核心就是两者对字符编码的处理逻辑完全不同。

先贴一下当时用来对比的测试代码:
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 7的Char(x)是基于ANSI代码页工作的:它把x当作ANSI编码的单字节值,然后根据系统默认的ANSI代码页映射成对应的字符。而C#里直接用(char)x,是把数值当作UTF-16编码的码点来转换——UTF-16和ANSI在0-127的ASCII字符范围是一致的,但128-255的扩展字符区间,两者的映射规则完全不一样,这就是差异的来源。

C#里的等效实现

要在C#里复刻Delphi 7 Char(x)的行为,直接用System.Text.Encoding.Default.GetChars就可以,因为这个方法会自动使用系统默认的ANSI代码页来完成字节到字符的转换,和Delphi 7的逻辑完全匹配。

可以封装成一个简单的方法来复用:

public char DelphiStyleChar(int x)
{
    // 确保输入值在0-255范围内,和Delphi的Char参数范围一致
    byte[] byteData = new byte[] { (byte)x };
    char[] resultChars = System.Text.Encoding.Default.GetChars(byteData);
    return resultChars[0];
}

把之前的C#测试代码改成调用这个方法,就能得到和Delphi 7完全一致的输出了:

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

内容的提问来源于stack exchange,提问作者THEDOCTOR

火山引擎 最新活动