关于gradle乱码的问题的答案以及类似问题的解决方法

在windows里面有两种东西去控制程序的字符编码,一个是windows代码页,一个是系统编码,其中系统编码很好理解,就是当前系统使用的编码,看起来就像一个环境变量一样,而代码页是可以切换的,不同程序可以使用不同的代码页去运行,比如一个程序使用utf8(代码页65001),一个程序使用gbk(代码页936),程序正在使用中的代码页叫做活动代码页,不过代码页已经是过去式了,微软不提倡新软件使用windows代码页,所以代码页只对老软件有效,其中就包括java

问题的产生

java运行时有一个参数叫做charset.defaultset,这个参数就是-Dfile.encoding=xxx这个虚拟机参数指定的,许多人都用它来解决乱码问题,可惜不总是有用,这个参数只和读取文件以及默认字符编码有关,也就是charset.defaultset,所要解决的java的乱码一般都是输出到控制台时出现乱码,而java的输出字符编码则是由windows代码活动页决定的,也就是说如果你在一个cmd里面执行java程序,这个cmd此时活动页为936,也就是编码gb2312,那么你的java程序打印字符串时,会把所有要打印的字符串转换为gb2312,如果你的活动页是utf8,那么同理,也就是说当前控制台的活动代码页决定了java输出什么编码的字符串。
可以通过chcp查看当前控制台的活动代码页,也可以通过chcp 代码页id 来切换当前代码页,65001就是utf8编码的代码页id
可以通过chcp查看当前控制台的活动代码页,也可以通过chcp 代码页id 来切换当前代码页,65001就是utf8编码的代码页id

通过指定当前活动代码页可以解决输出乱码问题,当然前提是你的class文件本身不是乱码的,如果你在编译一个utf8格式的java文件时,采用了gbk的编码去编译代码,那么文件本身就是乱码,输出自然也是乱码。

在这里插入图片描述
采用gbk的编译参数去编译一个utf8的java文件(javac似乎是采用系统编码作为默认编码去编译java文件),可能会导致以上情况,只是可能,也许你换一个字符串就不会出现这个错误,但是从class文件看来,你的源文件依旧是乱码,即使输出正确也不过是歪打正着罢了

所以正确的写法是
在这里插入图片描述
看到这里,许多人也许尝试了使用控制台运行,但是依旧发现代码运行是乱码,即使采用了utf8的代码页,utf8的源文件,但是输出依旧乱码,比如这样
在这里插入图片描述
这里的问题并不是java源文件,或者java输出编码的问题,java依旧在采用utf8的模式输出,这里的问题在于powershell
powershell本身是个新软件,于是powershell会采用系统编码去展示它的内容,也就是gb2312,还好powershell有修改编码的能力,通过以下命令修改powershell的编码
在这里插入图片描述
此时问题就清晰了,powershell本身展示文字时的编码是系统编码gb2312,而java会根据当前代码活动页去输出结果,也就是输出utf8,可以看到图片上当前代码活动页为utf8,java运行之后输出乱码,而修改展示编码为utf8之后,输出正常

所以powershell是个特殊的存在,即使你把所有编码都设置正确,powershell的展示却是gbk,也真是够坑的

接下来讲讲idea的编码,idea很神奇,似乎统一了所有位置的编码,这个设置就是文件->编码里的全局编码,这个设置把输出,文件编码,以及编译时的编码都指定为了utf8,所以使用idea本身的构建系统时完全不会有不一致的问题,但是只是idea本身的构建系统,其他构建系统就不一定了

比如gradle,gradle是个独立的组件,不受idea的设置影响,并且gradle的输出似乎受到的是系统编码的影响,而不是活动代码页,gradle执行完代码,接着把输出结果返回给idea显示罢了,讲到这里,问题就非常清楚了,gradle使用gbk去编译utf8格式的java代码,然后以gbk输出结果,再返回给idea输出,然而此时idea使用着默认的utf8全局编码,会用utf8去展示gbk的内容,这就是gradle乱码产生的原因。

在这里插入图片描述

要解决这个问题,并不是通过网上所说的什么-Dfile.encoding=utf8,有时候这样确实有用,因为idea会通过某种方法去让gradle也使用自己的参数
而我们之前提过-Dfile.encoding参数不过是设置文件读取写入编码而已,所以这其实只解决了gradle使用gbk格式编译utf8文件而已,关于gradle编译时指定目标文件编码有这个方法解决
在这里插入图片描述
在build.gradle里面加入这段代码就行
tasks.withType(JavaCompile) {
options.encoding = ‘UTF-8’
}

所以想要解决gradle输出乱码问题,要么指定gradle采用某种编码,要么修改idea全局设置为gbk,但是这几种方法都不太好,只有一种方法,就是修改系统编码为utf8,但是这样会导致老软件的显示出错。
在这里插入图片描述
控制面板,时钟,区域,管理,更改系统区域设置,这个方法可以通过修改系统编码为utf8解决大多数问题,由于系统编码优先级较高,所以修改了系统编码,默认活动代码页也会被修改为utf8

  • 22
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值