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

使用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)。

排查与解决步骤

  1. 检查IntelliJ文件编码设置
    打开File > Settings > Editor > File Encodings,确保:

    • Project Encoding和Default encoding for properties files都设置为UTF-8;
    • 查看右下角状态栏的当前文件编码,如果不是UTF-8,点击切换并选择"Convert"(而非"Reload")。
  2. 验证字符串实际编码
    在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码),说明编码确实被错误转换了。
  3. 检查运行配置的JVM编码参数
    查看IntelliJ的Run/Debug Configurations,确认VM options中没有设置-Dfile.encoding=ISO-8859-1或其他非UTF-8编码参数,如有则删除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 12:13:24