使用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
相关产品推荐
相关产品推荐

