使用substring()获取带重音字符异常:IntelliJ与jshell结果不一致
为什么
"ąbc".substring(0,1)在IntelliJ中返回a而非ą,但JShell和单元测试正常? 核心原因:源代码编码与IntelliJ配置不匹配
最常见的问题是IntelliJ没有正确识别源代码文件的编码,导致字符串中的ą被错误转码:
- JShell默认采用UTF-8处理输入,能正确解析
ą这个Unicode字符; - 你的单元测试能正常运行,是因为Maven默认使用UTF-8编译源代码,编译时正确保留了
ą的编码; - 但直接在IntelliJ中运行代码时,如果文件编码或IDE配置错误,
ą会被转成a(比如用ISO-8859-1编码读取UTF-8格式的文件,ą的UTF-8字节会被错误解析为a+不可见字符,substring(0,1)就取到了a)。
排查与解决步骤
检查IntelliJ文件编码设置
打开File > Settings > Editor > File Encodings,确保:- Project Encoding和Default encoding for properties files都设置为UTF-8;
- 查看右下角状态栏的当前文件编码,如果不是UTF-8,点击切换并选择"Convert"(而非"Reload")。
验证字符串实际编码
在IntelliJ中添加代码打印字符的字节数组:import java.util.Arrays; public class TestEncoding { public static void main(String[] args) { String s = "ąbc"; System.out.println(Arrays.toString(s.getBytes())); System.out.println(s.substring(0,1)); } }- 正常UTF-8下,
ą的字节数组是[-61, -93, 98, 99]; - 如果输出包含
97(a的ASCII码),说明编码确实被错误转换了。
- 正常UTF-8下,
检查运行配置的JVM编码参数
查看IntelliJ的Run/Debug Configurations,确认VM options中没有设置-Dfile.encoding=ISO-8859-1或其他非UTF-8编码参数,如有则删除。
内容的提问来源于stack exchange,提问作者menteith
相关产品推荐
相关产品推荐

