C#报错:无法将索引0处的字节[96]从指定代码页转换为Unicode
解决“无法将索引0处的字节[96]从指定代码页转换为Unicode”报错
报错说明
报错信息:无法将索引0处的字节[96]从指定代码页转换为Unicode,字节96对应ASCII字符`(反引号),通常是输入字符串包含编码不匹配字符、不可见控制字符或非预期特殊字符,导致编码解析失败。
相关代码
request.medicareCardNumber = Medino.Text; request.dateOfBirth = DateTime.Parse(Birth.Text); /*--- string date = Birth.Text; string datecon = ""; datecon = DateTime.ParseExact(date, "dd/MM/yyyy", CultureInfo.InvariantCulture).ToString("ddMMMyyyy"); request.dateOfBirth = DateTime.Parse(datecon); ---*/ request.givenName = GName.Text; request.familyName = FName.Text; // request.medicareIRN = IRNNo.Text;// optional. Please provide any value otherwise comment out this code as sending blank IRN in the request returns format error. var input = "0x01, 0x02, 0x03";
var array = input .Split(',') .Select(i => i.Trim().Replace("0x", "")) .Select(i => Convert.ToByte(i, 16)) .ToArray();
问题分析
- UI输入含非法字符:Medino.Text、Birth.Text等控件的输入内容可能混入反引号、全角空格、控制字符等非预期字符,这些字符在编码转换时触发错误。
- 日期解析的隐式风险:
DateTime.Parse依赖系统文化设置,若输入日期字符串含隐藏非法字符,不仅会解析失败,还可能触发编码层面的错误;注释中的ParseExact更规范,但未处理输入中的脏字符。 - 字节数组转换的潜在隐患:当前
input是硬编码值,但若实际场景中input来自外部(如文件、接口、UI输入),混入的非十六进制字符(比如反引号)会导致Convert.ToByte失败,进而触发编码报错。
解决方案
1. 清理所有UI输入文本
对从控件读取的字符串进行过滤,只保留合法字符:
using System.Text.RegularExpressions; using System.Globalization; // 清理医保卡号:仅保留字母和数字 request.medicareCardNumber = Regex.Replace(Medino.Text, @"[^a-zA-Z0-9]", ""); // 清理日期输入:仅保留数字和分隔符/,用ParseExact确保格式正确 string cleanBirthDate = Regex.Replace(Birth.Text, @"[^0-9/]", ""); request.dateOfBirth = DateTime.ParseExact(cleanBirthDate, "dd/MM/yyyy", CultureInfo.InvariantCulture); // 清理姓名输入:保留字母、空格、常见符号(可根据需求调整正则) request.givenName = Regex.Replace(GName.Text, @"[^a-zA-Z\s]", ""); request.familyName = Regex.Replace(FName.Text, @"[^a-zA-Z\s]", "");
2. 增强字节数组转换的容错性
如果input来自外部输入,先清理非合法十六进制相关字符,再进行转换:
using System.Text.RegularExpressions; var input = "0x01, 0x02, 0x03"; // 实际场景中可能是外部输入 // 清理掉所有非十六进制、逗号、空格、0x的字符 var cleanedInput = Regex.Replace(input, @"[^0-9A-Fa-f,x\s]", ""); var array = cleanedInput .Split(',') .Where(i => !string.IsNullOrWhiteSpace(i.Trim())) // 过滤空项 .Select(i => i.Trim().Replace("0x", "")) .Select(i => Convert.ToByte(i, 16)) .ToArray();
3. 确保编码一致性
检查所有输入源的编码格式,统一使用UTF-8编码读取/处理字符串,避免系统默认编码(如GBK、ISO-8859-1)与输入编码不匹配导致的解码错误。
内容的提问来源于stack exchange,提问作者abburi anusha chowdary
相关产品推荐
相关产品推荐

