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

读取含+号文件字符串时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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 15:58:10