Skip to content

Latest commit

 

History

History
141 lines (130 loc) · 5.15 KB

Windows下遇到编码问题可以看看.md

File metadata and controls

141 lines (130 loc) · 5.15 KB

Windows下一些编码问题的记录

添加代码

MainAppstart方法末尾添加

System.out.println("你好");

PowerShell

查看当前编码

[System.Console]::OutputEncoding
BodyName          : gb2312
EncodingName      : 简体中文(GB2312)
HeaderName        : gb2312
WebName           : gb2312
WindowsCodePage   : 936
IsBrowserDisplay  : True
IsBrowserSave     : True
IsMailNewsDisplay : True
IsMailNewsSave    : True
IsSingleByte      : False
EncoderFallback   : System.Text.InternalEncoderBestFitFallback
DecoderFallback   : System.Text.InternalDecoderBestFitFallback
IsReadOnly        : False
CodePage          : 936

1.使用mvn javafx:run

Java标准输出流(GB2312) -> PowerShell(GB2312)

你好

2.使用.\gradlew.bat run

Java标准输出流(GB2312) -> gradle(UTF-8) -> PowerShell(GB2312)

锟斤拷锟?

3.修改build.gradle中的application配置块为

使标准输出流使用UTF-8编码

application {
    applicationName = "JavaFXSample"
    mainModule.set("sample")
    mainClass.set("com.icuxika.MainApp")
    applicationDefaultJvmArgs = [
            // ZGC
            "-XX:+UseZGC",
            // 当遇到空指针异常时显示更详细的信息
            "-XX:+ShowCodeDetailsInExceptionMessages",
            "-Dsun.java2d.opengl=true",
            // 不添加此参数,打包成exe后,https协议的网络图片资源无法加载
            "-Dhttps.protocols=TLSv1.1,TLSv1.2",
            "-Dsun.stdout.encoding=UTF-8",
            "-Dsun.stderr.encoding=UTF-8"
    ]
}

4.再次执行.\gradlew.bat run

Java标准输出流(UTF-8) -> gradle(UTF-8) -> PowerShell(GB2312)

浣犲ソ

5.设置PowerShell使用UTF-8编码

[System.Console]::OutputEncoding = [System.Text.Encoding]::UTF8
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        : False
CodePage          : 65001

6.使用mvn javafx:run

Java标准输出流(GB2312) -> PowerShell(UTF-8)

���

7.使用.\gradlew.bat run

Java标准输出流(UTF-8) -> PowerShell(UTF-8)

你好

8.修改build.gradle中的application配置块为

application {
    applicationName = "JavaFXSample"
    mainModule.set("sample")
    mainClass.set("com.icuxika.MainApp")
    applicationDefaultJvmArgs = [
            // ZGC
            "-XX:+UseZGC",
            // 当遇到空指针异常时显示更详细的信息
            "-XX:+ShowCodeDetailsInExceptionMessages",
            "-Dsun.java2d.opengl=true",
            // 不添加此参数,打包成exe后,https协议的网络图片资源无法加载
            "-Dhttps.protocols=TLSv1.1,TLSv1.2"
    ]
}

9.再次执行.\gradlew.bat run

Java标准输出流(GB2312) -> gradle(UTF-8) -> PowerShell(UTF-8)

���

总结

  • java 默认标准输出流使用的编码由操作系统的编码决定
  • maven 以Maven plugin for JavaFX插件为例,它实际获取到javajlink的路径后通过cmd /c java的方式来执行命令,且插件没有提供参数让你传递vm选项,因此无法传递sun.stdout.encoding之类的属性给到插件里的命令,想要不乱码,只能使显示输出的前端编码匹配操作系统的默认编码。注意:其他的maven项目执行代码的java程序如果没有隔了这么一层,通过对maven-compiler-plugin设置<compilerArguments>来设置相关选项
  • gradle 由于gradle run没有像mvn javafx:run这样隔了一层间接调用java可以通过applicationDefaultJvmArgs来设置选项。注意:gradle jpackageImage的情况就跟上面很像了
  • gradle 还有一处特别,gradle编译项目时,相关流会经历 gradle -> gradle daemon -> java compiler,java compiler -> gradle daemon -> gradle,其中 gradle daemon -> gradle 的时候,默认使用了UTF-8来进行序列化,所以gradle相关的命令注释多了中间一层,同时由于中间默认多了层UTF-8转化,且插件无法传入vm选项时,这个乱码无解,只能Windows操作系统全局设置UTF-8
  • 上面所说的隔了一层主要意思是指能不能传递vm选项给到javajlink

补充

如果你在PowerShell中执行[System.Console]::OutputEncoding = [System.Text.Encoding]::UTF8后,发现java --help乱码了,你可以执行[System.Console]::OutputEncoding = [System.Text.Encoding]::Default回到默认设置,也可以

C:\CommandLineTools\Java\jdk-21\bin\java.exe -D"sun.stdout.encoding"=UTF-8 -D"sun.stderr.encoding"=UTF-8 --help
C:\CommandLineTools\Java\jdk-21\bin\jpackage.exe --help -J-D"sun.stdout.encoding"=UTF-8 -J-D"sun.stderr.encoding"=UTF-8

注意目标为java时,-D要在--help的前面,目标为jpackage时,-J-D可以放在后面