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

使用String.charAt()和+拼接字符出现UTF-8编码异常求助

问题分析与修复

核心错误

你这里犯了基础类型认知错误:group_short是char类型(数值型),用+=拼接另一个char时,执行的是算术加法,而非字符串拼接。

举个具体例子:

  • 'M'的ASCII值是77,'L'是76
  • 77 + 76 = 153,对应Unicode控制字符U+0099,它的UTF-8编码就是\xC2\x99——这就是数据库报错里的非法字符,这类控制字符通常不允许存储到字符串字段中。

修复方案

方案1:直接使用原字符串(最简洁)

你的metadata[2]本身就是完整的"ML"字符串,完全不需要手动拼接字符,直接赋值即可:

private PcbGroup createPcbGroup(String[] metadata, PcbGroup pcbGroup) {
    pcbGroup.setId(Integer.parseInt(metadata[0]));
    pcbGroup.setGroup_name(metadata[1]);
    // 直接用原字符串,跳过多余的拼接逻辑
    pcbGroup.setGroup_short(metadata[2]);
    return pcbGroup;
}

方案2:如果必须手动拼接(比如有额外字符处理逻辑)

把group_short改成String类型,或者用StringBuilder来拼接:

private PcbGroup createPcbGroup(String[] metadata, PcbGroup pcbGroup) {
    // 用String类型存储拼接结果
    String group_short = String.valueOf(metadata[2].charAt(0));
    
    pcbGroup.setId(Integer.parseInt(metadata[0]));
    pcbGroup.setGroup_name(metadata[1]);
    for (int i = 1; i < metadata[2].length(); i++) {
        // 此时+=是字符串拼接操作
        group_short += metadata[2].charAt(i);
    }
    pcbGroup.setGroup_short(group_short);

    return pcbGroup;
}

如果需要拼接的字符较多,推荐用StringBuilder提升性能:

private PcbGroup createPcbGroup(String[] metadata, PcbGroup pcbGroup) {
    StringBuilder groupShortSb = new StringBuilder();
    groupShortSb.append(metadata[2].charAt(0));
    
    pcbGroup.setId(Integer.parseInt(metadata[0]));
    pcbGroup.setGroup_name(metadata[1]);
    for (int i = 1; i < metadata[2].length(); i++) {
        groupShortSb.append(metadata[2].charAt(i));
    }
    pcbGroup.setGroup_short(groupShortSb.toString());

    return pcbGroup;
}

补充说明

数据库报错的本质是:你生成的\xC2\x99是Unicode控制字符,不属于常规可打印字符串,而你的group_short字段应该只允许存储常规文本,因此数据库拒绝写入。修复后用正常字符串赋值就能解决这个问题。

内容的提问来源于stack exchange,提问作者dbuergi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 10:05:23