读取含+号文件字符串时Substring索引越界报错的解决咨询
解决C#读取文本丢失+号及索引报错的问题
碰到这种读取文本时丢字符、还报“索引和长度必须引用字符串内的位置”错误的情况,我太熟悉了!问题的根源其实出在你使用的UTF7编码上。
为什么会丢失+号?
UTF7编码里,+是一个特殊符号——它用来标记后续内容是Base64编码的字符序列。当你用UTF7读取包含普通+的文本时,编码解析器会把它当成编码标识处理,直接丢弃或者转换,导致原字符串里的+消失,整体长度变短,后面用固定索引的Substring自然就越界报错了。
解决步骤
第一步:确认文件的实际编码
先搞清楚你的baspre.txt到底用的是什么编码。最简单的方法是用记事本打开文件,点击「文件」→「另存为」,看对话框底部的「编码」选项(常见的有UTF-8、ANSI、Unicode等)。第二步:替换正确的编码读取文件
把StreamReader的编码参数改成文件实际使用的编码,比如:// 如果是UTF-8编码(带BOM或不带都可以) StreamReader sr = new StreamReader(fsInPre, System.Text.Encoding.UTF8); // 如果是Windows系统默认的ANSI编码(对应Windows-1252) StreamReader sr = new StreamReader(fsInPre, System.Text.Encoding.Default); // 或者直接指定编码编号 StreamReader sr = new StreamReader(fsInPre, System.Text.Encoding.GetEncoding(1252));这样读取出来的字符串就能保留原有的
+号,长度也和原文件一致了。第三步:用更安全的方式获取子串(可选但推荐)
硬编码索引(比如Substring(10,60))非常脆弱,只要文件格式稍有变化就会报错。建议用更灵活的方式提取内容:
比如按空格分割后定位,或者根据关键词(比如Diluy.、Aguja)来截取:// 示例:按空格分割后提取对应部分 string[] parts = lectura.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries); // 假设你要的内容在特定位置,可以通过数组索引获取 string desPart = string.Join(" ", parts.Skip(3).Take(5)); // 按需调整 // 或者用正则匹配特定格式的内容 var match = Regex.Match(lectura, @"(\d+)\s+(\w+UI)\s+(.*?)\s+(\d+)\s+(\w+)"); if (match.Success) { string code = match.Groups[1].Value; string uiPart = match.Groups[2].Value; // 其他分组按需提取 }
这样修改后,不仅能解决当前的+号丢失问题,还能让代码更健壮,适应文件格式的小变化。
内容的提问来源于stack exchange,提问作者Gabriel76
相关产品推荐
相关产品推荐

