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

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();

问题分析

  1. UI输入含非法字符:Medino.Text、Birth.Text等控件的输入内容可能混入反引号、全角空格、控制字符等非预期字符,这些字符在编码转换时触发错误。
  2. 日期解析的隐式风险:DateTime.Parse依赖系统文化设置,若输入日期字符串含隐藏非法字符,不仅会解析失败,还可能触发编码层面的错误;注释中的ParseExact更规范,但未处理输入中的脏字符。
  3. 字节数组转换的潜在隐患:当前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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 05:55:25