You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unicode转ASCII异常求助:字符'¾'转换结果错误(值为64)

解决Unicode转ASCII时字符被错误替换的问题

我来帮你搞定这个问题!首先得搞清楚为什么你的代码会得到错误的结果:

问题根源

ASCII编码只包含0-127范围内的字符,对于任何超出这个范围的Unicode字符(比如你用到的¾、à这些),.NET里的Encoding.ASCII会默认把它们替换成0x40(也就是十进制的64,对应字符@)——这就是你看到¾输出64的原因。

解决方案

根据你的需求,有两种不同的处理方式:

1. 保留原字符的单字节编码(推荐,如果你需要的是西欧扩展ASCII)

你的这些字符属于西欧语言常用的扩展字符,它们在Windows-1252编码(一种广泛使用的单字节扩展ASCII编码)里有对应的合法字节值。用这个编码替代Encoding.ASCII就能得到正确的结果:

string as_pass = "¾àÖ‘œ";
// 获取Windows-1252编码实例
Encoding win1252 = Encoding.GetEncoding("Windows-1252");
byte[] targetBytes = win1252.GetBytes(as_pass);

// 验证结果:每个字符对应的字节
foreach (byte b in targetBytes)
{
    Console.WriteLine($"字符对应的字节值:{b}");
}

运行后,¾会输出190(0xBE),à输出224(0xE0),其他字符也会得到它们在Windows-1252里的正确单字节表示。

2. 严格转换为ASCII(替换为等价的ASCII字符)

如果你必须得到纯粹的ASCII编码(仅0-127范围),那需要手动把这些特殊字符映射成对应的ASCII等价字符串,比如把¾换成"3/4",œ换成"oe"。可以用自定义映射来实现:

string as_pass = "¾àÖ‘œ";

// 定义特殊字符到ASCII等价物的映射
var charMap = new Dictionary<char, string>
{
    { '¾', "3/4" },
    { 'à', "a" },
    { 'Ö', "O" },
    { '‘', "'" },
    { 'œ', "oe" }
};

// 替换所有特殊字符
string asciiSafeString = string.Join("", as_pass.Select(c => 
    charMap.TryGetValue(c, out string replacement) ? replacement : c.ToString()));

// 转换为ASCII字节
byte[] asciiBytes = Encoding.ASCII.GetBytes(asciiSafeString);

这样得到的asciiBytes就是完全符合ASCII标准的字节数组了。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:13:38