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

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

  •  2
     
  •   Richard14 · 51 天前 · 2966 次点击
    这是一个创建于 51 天前的主题,其中的信息可能已经有所发展或是发生改变。

    按默认配置安装了最新的 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 的,新版里不太适用

    38 条回复    2022-07-13 15:47:11 +08:00
    ComputerIdiot
        1
    ComputerIdiot  
       51 天前 via Android
    运行选项勾上 external console
    同时 Windows 默认终端设置为 Windows Terminal
    CEBBCAT
        2
    CEBBCAT  
       51 天前 via iPhone
    其实编码问题无非就是输入输出。

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

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

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

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

    目前是测试了一下 powershell 里 echo"你好世界"这类的是会正常显示的,应该是 gbk 编码之类的。希望达到的效果是文件以 utf8 编码,sout 主要是打印状态,开发测试过程中使用,能显示中英文就可以满足,倒也不必覆盖完整 utf8 。第一次用 idea ,如果 idea 依赖于系统的控制台输出而没有其他解决办法的话感觉有点 low 啊,难道我必须把 shell 也调成 utf8 。。
    arch9999
        14
    arch9999  
       51 天前
    @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
       51 天前
    @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
    ComputerIdiot
        17
    ComputerIdiot  
       51 天前 via Android
    PowerShell 一直都能正常输入输出 Unicode 字符
    需要测试的是运行 java YourClass 能否正常输出
    nnegier
        18
    nnegier  
       51 天前
    我用 Clion 一样的问题,貌似处理方法还和 Intellj IDEA 不一样,还没解决,按理说编码问题就是输入和输出的字符编码集不一样导致的
    ComputerIdiot
        19
    ComputerIdiot  
       51 天前 via Android
    @nnegier MS 的 C Runtime 调用的不是 Unicode 版本的 Windows API ,需要自己调用 WriteConsoleW
    kamal
        20
    kamal  
       50 天前
    指定字体试试
    mmdsun
        21
    mmdsun  
       50 天前
    没用过社区版,最新旗舰版 idea 没有这个问题,莫非系统改过什么设置?
    leeyuzhe
        22
    leeyuzhe  
       50 天前
    idea64.exe.vmoptions 管用的,你是不是改错文件了,你不要自己找,直接点“帮助” -》“编辑自定义 vm 选项”
    cubecube
        23
    cubecube  
       50 天前
    换个中文字体试试,之前出过问题发现是某些字体无法显示中文
    Bingchunmoli
        24
    Bingchunmoli  
       50 天前
    @ComputerIdiot 是的,但是也是老软件,全局 UTF-8 其实有助于编码统一,但无助于 windows 的老旧生态
    Richard14
        25
    Richard14  
    OP
       50 天前
    @kamal
    @cubecube 如何指定字体呢?我是要修改 idea 设置还是 powershell 设置?

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

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

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