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
相关产品推荐
相关产品推荐

