V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Richard14
V2EX  ›  Java

新版本 IDEA 如何处理控制台中文输出乱码的问题?

  •  2
     
  •   Richard14 · 2022-06-19 23:51:50 +08:00 · 5188 次点击
    这是一个创建于 670 天前的主题,其中的信息可能已经有所发展或是发生改变。

    按默认配置安装了最新的 idea 社区版,创建了新项目,并创建了 hello world 文件( src/Main.java )只有这一个文件。按 Ctrl+Shift+F10 单文件编译执行正常输出 hello world ,但如果替换为中文则会显示乱码。

    目前做了的工作:在 Settings 里把 File Encodings 相关全部调成了 utf-8,以及把 idea 目录下的 idea64.exe.vmoptions ,修改为结尾添加了

    -Dfile:econding=UTF-8
    -Dconsole.encoding=UTF-8
    

    经过以上两点修改后乱码问题仍无改善,请问应该怎么设置呢?网上资料大部分是旧版 idea 的,新版里不太适用

    39 条回复    2022-09-03 00:23:50 +08:00
    SMGdcAt4kPPQ
        1
    SMGdcAt4kPPQ  
       2022-06-19 23:56:58 +08:00 via Android
    运行选项勾上 external console
    同时 Windows 默认终端设置为 Windows Terminal
    CEBBCAT
        2
    CEBBCAT  
       2022-06-19 23:56:59 +08:00 via iPhone
    其实编码问题无非就是输入输出。

    代码用什么编码输出的,用对应的编码解码,自然可以得到正确的结果。

    建议楼主用 iconv 、od 、echo 、base64 等工具对 stdin/stdout 进行调试。

    上面提的那些工具如果不会用的话,建议检查 .java 文件编码、IntelliJ IDEA 终端编码
    Bingchunmoli
        3
    Bingchunmoli  
       2022-06-20 00:02:01 +08:00
    设置-》 编辑器》里面有文件编码,最好设置 UTF-8 windows 默认 GBK 和 ISO-8859-1 终端默认 GBK
    Bingchunmoli
        4
    Bingchunmoli  
       2022-06-20 00:02:59 +08:00
    通常 windows 默认 GBK 如果修改 UTF-8 需要修改注册表。一般是不懂终端,但是正常不乱吗。
    SMGdcAt4kPPQ
        5
    SMGdcAt4kPPQ  
       2022-06-20 00:04:16 +08:00 via Android
    @Bingchunmoli Windows 修改全局 UTF-8 会导致部分软件乱码,不建议也没必要这样做
    Richard14
        6
    Richard14  
    OP
       2022-06-20 00:25:04 +08:00
    @ComputerIdiot 运行选项具体指什么,我在 Run/Debug Configuration 里没有找到 external console 的选项。windows 默认终端是指修改 windows 设置,还是指修改 idea 的关联设置。如果是前者难道我需要额外安装一个 terminal 才能用,我记得这个软件不是 win 默认预装的
    SMGdcAt4kPPQ
        7
    SMGdcAt4kPPQ  
       2022-06-20 00:41:22 +08:00 via Android
    @Richard14 我一直用的 Rider 没发现 IDEA 是没有 external console 这个选项的
    Windows 默认终端是 Win11 的新设置,可以用 Windows Terminal 代替原来的 conhost ,conhost 可以输出中文但不能输出 emoji ,换成 Windows Terminal 就可以了
    SMGdcAt4kPPQ
        8
    SMGdcAt4kPPQ  
       2022-06-20 00:42:38 +08:00 via Android
    首先得测试一下不用 IDEA 的控制台运行是否乱码,如果不乱码就是 IDEA 的问题
    SMGdcAt4kPPQ
        9
    SMGdcAt4kPPQ  
       2022-06-20 00:50:38 +08:00 via Android
    在 C#里我只需要加上
    Console.OutputEncoding = Encoding.UTF8;
    Console.InputEncoding = Encoding.UTF8;
    就可以正常从 Windows Terminal 输入输出 Emoji ,Java 怎么做都只能输出中文不能输出 Emoji ,可能是 Java 内部没有使用 WriteConsoleW 这个 API
    geying
        10
    geying  
       2022-06-20 03:31:34 +08:00
    查看下文件编码,上次项目也遇到过 (有个地方设置选择 utf-8 或 other)
    虽然编辑器中午是正常 但是命令行是乱码
    linweizhi
        11
    linweizhi  
       2022-06-20 05:07:20 +08:00
    试一下添加一个环境变量?
    JAVA_TOOL_OPTIONS = -Duser.language=en
    arch9999
        12
    arch9999  
       2022-06-20 05:18:34 +08:00
    Richard14
        13
    Richard14  
    OP
       2022-06-20 06:15:36 +08:00
    @linweizhi 试了试没有效果

    @arch9999 看起来需要更改系统本身的编码?感觉不太对,另外我也担心其他程序 bug ,不想进行类似修改。

    目前是测试了一下 powershell 里 echo"你好世界"这类的是会正常显示的,应该是 gbk 编码之类的。希望达到的效果是文件以 utf8 编码,sout 主要是打印状态,开发测试过程中使用,能显示中英文就可以满足,倒也不必覆盖完整 utf8 。第一次用 idea ,如果 idea 依赖于系统的控制台输出而没有其他解决办法的话感觉有点 low 啊,难道我必须把 shell 也调成 utf8 。。
    arch9999
        14
    arch9999  
       2022-06-20 06:25:46 +08:00
    @Richard14 #13

    ```
    > $OutputEncoding

    Preamble :
    BodyName : utf-8
    EncodingName : Unicode (UTF-8)
    HeaderName : utf-8
    WebName : utf-8
    WindowsCodePage : 1200
    IsBrowserDisplay : True
    IsBrowserSave : True
    IsMailNewsDisplay : True
    IsMailNewsSave : True
    IsSingleByte : False
    EncoderFallback : System.Text.EncoderReplacementFallback
    DecoderFallback : System.Text.DecoderReplacementFallback
    IsReadOnly : True
    CodePage : 65001
    ```
    Richard14
        15
    Richard14  
    OP
       2022-06-20 07:30:18 +08:00
    @arch9999

    PS C:\WINDOWS\system32> $OutputEncoding


    IsSingleByte : True
    BodyName : us-ascii
    EncodingName : US-ASCII
    HeaderName : us-ascii
    WebName : us-ascii
    WindowsCodePage : 1252
    IsBrowserDisplay : False
    IsBrowserSave : False
    IsMailNewsDisplay : True
    IsMailNewsSave : True
    EncoderFallback : System.Text.EncoderReplacementFallback
    DecoderFallback : System.Text.DecoderReplacementFallback
    IsReadOnly : True
    CodePage : 20127
    SMGdcAt4kPPQ
        17
    SMGdcAt4kPPQ  
       2022-06-20 08:28:16 +08:00 via Android
    PowerShell 一直都能正常输入输出 Unicode 字符
    需要测试的是运行 java YourClass 能否正常输出
    nnegier
        18
    nnegier  
       2022-06-20 09:49:24 +08:00
    我用 Clion 一样的问题,貌似处理方法还和 Intellj IDEA 不一样,还没解决,按理说编码问题就是输入和输出的字符编码集不一样导致的
    SMGdcAt4kPPQ
        19
    SMGdcAt4kPPQ  
       2022-06-20 11:39:39 +08:00 via Android
    @nnegier MS 的 C Runtime 调用的不是 Unicode 版本的 Windows API ,需要自己调用 WriteConsoleW
    kamal
        20
    kamal  
       2022-06-20 13:06:12 +08:00
    指定字体试试
    mmdsun
        21
    mmdsun  
       2022-06-20 13:42:36 +08:00
    没用过社区版,最新旗舰版 idea 没有这个问题,莫非系统改过什么设置?
    leeyuzhe
        22
    leeyuzhe  
       2022-06-20 14:29:34 +08:00
    idea64.exe.vmoptions 管用的,你是不是改错文件了,你不要自己找,直接点“帮助” -》“编辑自定义 vm 选项”
    cubecube
        23
    cubecube  
       2022-06-20 15:15:31 +08:00
    换个中文字体试试,之前出过问题发现是某些字体无法显示中文
    Bingchunmoli
        24
    Bingchunmoli  
       2022-06-20 15:37:04 +08:00
    @ComputerIdiot 是的,但是也是老软件,全局 UTF-8 其实有助于编码统一,但无助于 windows 的老旧生态
    Richard14
        25
    Richard14  
    OP
       2022-06-21 10:05:08 +08:00
    @kamal
    @cubecube 如何指定字体呢?我是要修改 idea 设置还是 powershell 设置?

    @leeyuzhe 试了修改后无变化。主目录下的 idea64.exe.vmoptions 内容有很多行与网上提供的一致,你说的那个位置打开只有一句-Xmx1454m ,不是一个文件啊
    leeyuzhe
        26
    leeyuzhe  
       2022-06-21 10:14:02 +08:00
    我说那个位置 100% 会在启动时加载的,在那改准没错。
    然后把你的乱码复制一段贴出来
    Richard14
        27
    Richard14  
    OP
       2022-06-21 11:27:22 +08:00
    mxjump
        28
    mxjump  
       2022-06-21 13:00:46 +08:00
    @Richard14 楼主我 3 、4 个月前用 tomcat 也是控制台乱码,跟着这个帖子弄好的,你看看有没有用

    百度搜“解决 IntelliJ IDEA 中 tomcat 控制台中文乱码问题”,csdn 的帖子,作者 Dragon~Snow

    。。。。刚注册,发不了链接,,希望里面的办法能帮到楼主
    mxjump
        29
    mxjump  
       2022-06-21 13:01:49 +08:00
    @mxjump 应该第一个帖子就是
    leeyuzhe
        30
    leeyuzhe  
       2022-06-21 13:38:56 +08:00   ❤️ 1
    @Richard14 你这方向找错了,你这种都是问号的乱码是以 utf8 的方式读取 gbk 编码的中文。所以你这个乱码不是 idea 的问题也不是 idea console 的问题,而是你的 java 程序输出了乱码。你点一下右上角调试运行那里那个“main”,然后编辑
    然后添加运行时的 vm 参数-Dfile.encoding=UTF-8
    leeyuzhe
        31
    leeyuzhe  
       2022-06-21 13:41:48 +08:00   ❤️ 1
    刚发现你的 File Encodings 一直写错了,注意是 file.encoding ,你一直写成了 file:encoding!
    litchinn
        32
    litchinn  
       2022-06-21 16:53:33 +08:00   ❤️ 1
    看到你的控制台用的是 jdk18 ,这个应该是 jdk18 的问题,https://bugs.eclipse.org/bugs/show_bug.cgi?id=579383
    在 jdk18 的这个问题(具体原因不明)有结果之前,换成 GBK 或者更换成其他版本 jdk 可以解决
    SMGdcAt4kPPQ
        33
    SMGdcAt4kPPQ  
       2022-06-21 18:04:59 +08:00
    @litchinn 之前用 JDK18 EA 的时候就遇到了这个问题,没想到 GA 了还没修
    不能输出 Emoji 的问题有人反馈过吗?
    SMGdcAt4kPPQ
        34
    SMGdcAt4kPPQ  
       2022-06-21 18:59:30 +08:00
    @nnegier 刚刚试了一下 Rust ,在 Windows Terminal 里运行能正确输出 Emoji ,在 CLion 和 conhost 能正确输出部分 Emoji ,中文当然都没问题
    gumayusi
        35
    gumayusi  
       2022-06-21 22:14:29 +08:00   ❤️ 1
    我猜测一下,既然 OP 安装 IDEA 都要最新版,那想必 JDK 版本也是最新的。百度"IDEA Java18 中文",找到了一篇 CSDN 的博文,标题是"解决 jdk18 下 IntelliJ IDEA2021.3 中文乱码问题"。点进去看了一下,发现 IDEA 和 Java18 有兼容性问题。我用虚拟机里的全新 Windows11 测试了一下,安装全新的 IDEA+JDK17+JDK18 ,如果新建项目时使用 JDK17 ,中文就能正常显示,如果使用 JDK18 ,中文就会乱码(而且就是 OP 截图中菱形问号式的乱码),问题解决(*^_^*)。另外,Java18 默认编码改为 UTF-8 了,可能 IDEA 之前的代码兼容不了所以中文显示乱码,以后的版本应该会修复吧。
    SMGdcAt4kPPQ
        36
    SMGdcAt4kPPQ  
       2022-06-22 00:10:58 +08:00 via Android
    @ComputerIdiot 之前用 JDK18 的时候也是乱码,但是换 Kotlin ,同样也是 JDK18 ,就不乱码
    Richard14
        37
    Richard14  
    OP
       2022-06-22 04:48:19 +08:00
    @leeyuzhe 网上教学直接复制的,没注意句号还是错的,害人不浅啊
    goalidea
        38
    goalidea  
       2022-07-13 15:47:11 +08:00
    这是提醒你需要付费上 ultimate 版🤪
    spe
        39
    spe  
       2022-09-03 00:23:50 +08:00
    搞了 2 小时,无数个方法,终于找到了,还真是 jdk18 的问题
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1019 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:11 · PVG 03:11 · LAX 12:11 · JFK 15:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.