[转帖]Java -Dfile.encoding=UTF-8 干掉乱码

java,dfile,encoding,utf,干掉,乱码 · 浏览次数 : 0

小编点评

**乱码问题的原因:** 在不同的启动方式下,`file.encoding`属性的值可能不同,导致乱码问题。 **解决方案:** 1. 在启动程序之前设置 `file.encoding` 属性。 2. 使用 `-D` 参数传递 `file.encoding` 属性的值。 3. 使用 `Jar Bundler.app` 进行打包,并确保 `file.encoding` 属性在打包过程中被设置。 **设置 `file.encoding` 属性的方法:** * 在命令行中:`System.setProperty("file.encoding", "UTF-8");` * 在 Java 代码中:`String fileEncoding = System.getProperty("file.encoding");`并设置属性。 **示例代码:** ```java // 设置文件编码 System.setProperty("file.encoding", "UTF-8"); // 使用 Jar Bundler.app 进行打包 JarBundler.run("Test.jar", "-Dfile.encoding=UTF-8"); ``` **其他提示:** * 使用 `git diff` 命令对不同版本的 jar 文件进行差异比较,以确定更改的来源。 * 尝试使用不同的 Java 版本。 * 确保运行程序的内存充足。

正文

https://www.cnblogs.com/fnlingnzb-learner/p/10682304.html

 

遭遇乱码问题的来龙去脉

这两天写了一个 Java 程序来玩,结果又遭遇了以前遇到过很多次的乱码问题,具体描述一下:
在 Mac 系统里面,常用的 Java 程序启动方式有如下几种:
1.通过 eclipse 执行 class 入口文件启动;
2.在 Terminal 里面用 java Test.class 或 jave -jar Test.jar 启动
3.通过 ant 执行 class 入口文件启动;
4.直接用 ant 执行 jar 文件;
5.用 Mac OS CoreServices 中的 Jar Launcher.app 执行 jar 文件。
6.用 Mac OS 自带的 Jar Bundler.app 将 jar 文件包装成 app,然后执行

执行途径还是相当地丰富,但以不同的方式来执行,从控制台中得到的程序输出也不一致
比如说,刚刚在 eclipse 中还能正常打印出来的汉字,在打成 jar 包以后,
双击该 jar 文件以 Jar Launcher.app 的方式来启动,打印出来的文字就成了乱码了。
毕竟写出来的 java 程序最终还是要打成 Jar 包来使用的,总不能每次都在 eclipse 中启动吧?
前面说过,不是第一次碰到这种问题了,于是便想着要把这个问题给解决下。
灵机一动之下想到一个好办法,在这些启动方式下均把 System 中的属性遍历打印出来,
然后用 git 来做各个版本的差异比较,有可能会套出一些蛛丝马迹~
抱着试一试的想法实践了一把,果然发现一些猫腻,集中体现在 file.encoding 这个属性上面。
在 file.encoding 属性的值是 UTF-8 时,是不存在乱码问题的,eclipse 执行就属于这种情况。
Jar Launcher.app 执行时,该属性的值就变成 MacRoman 了,
上面给出的资料中有对该属性的介绍,可以用 java -D<name>=<value> Test.jar 来更改它。
另外,只有在启动 java 程序前通过传递参数来更改才有效,程序一经启动就无法再更改了。
这样的话,也就只有通过传递 jvm 参数的方式来做默认编码的变更了:
其一,写一个带 -Dfile.encoding=UTF-8 参数的脚本文件来启动;
其二,用 Jar Bundler.app 打包成 app,效率应该不如第一种方案。
原理其实都差不多,都只是将更改 jvm 默认编码的操作封装了起来,执行时就不用再手动键入了。

java 乱码问题 -Dfile.encoding=UTF-8

-Dfile.encoding 解释:
在命令行中输入 java,在给出的提示中会出现 -D 的说明:
-D<name>=<value> # set a system property
-D 后面需要跟一个键值对,作用是设置一项系统属性
对 -Dfile.encoding=UTF-8 来说就是设置系统属性 file.encoding 为 UTF-8
那么 file.encoding 什么意思?字面意思为文件编码。
搜索 java 源码,只能找到 4 个文件中包含 file.encoding 的文件,
也就是说,只有四个文件调用了 file.encoding 这个属性。
在 java.nio.charset 包中的 Charset.java 中,这段话的意思说的很明确了。
简单说就是默认字符集是在 java 虚拟机启动时决定的,
依赖于 java 虚拟机所在的操作系统的区域以及字符集。
代码中可以看到,默认字符集就是从 file.encoding 这个属性中获取的。

与[转帖]Java -Dfile.encoding=UTF-8 干掉乱码 相似的内容:

[转帖]Java 近期新闻:JEP 更新,GraalVM 贡献给 OpenJDK,JavaOne 重启

https://www.infoq.cn/article/kzzbQg5zgissaCcJlfey JEP 432记录模式(第二预览版)在上周从其 8294078 草案晋升为候选状态。相比 JEP 405 记录模式(预览版),该 JEP 更新了:对通用记录模式类型参数推断的支持、新增对记录模式出现在

[转帖]Java中线程的生命周期

https://blog.51cto.com/u_15773567/5832430 1 介绍 本篇文章我们讨论下Java中的一个非常核心的概念:线程的生命周期。在Java编程语言中,多线程编程非常重要。线程从创建到销毁是有生命周期的,在线程的生命周期中,线程会经历多种状态(state)。 2 线程状

[转帖]Java调优系列之工具篇之btrace、gperftools

https://github.com/landon30/Bulls/wiki/java-profiling-tools landon 网络游戏资深服务器架构师 2018-06-14 线上遇到了问题? 服务上线出问题,想增加打印日志怎么办? 线上怀疑某个接口慢,想打印接口耗时怎么办? 线上某个接口报错

[转帖]Java游戏服务器调优实践

https://www.jianshu.com/p/344f8141b63e Java Profiling Practice landon资深网络游戏服务器架构师 系统性能定义 Throughput 吞吐量,也就是每秒钟可以处理的请求数,任务数 Latency 系统延迟,也就是系统在处理一个请求或一

[转帖]java中方法不要写太长的真正原因

https://www.iteye.com/blog/enetor-976070 java中一般建议一个方法不要写的过长,不方便维护和阅读是其中的一个原因,但是其真正性能的原因大家知道吗? 我们知道,JVM一开始是以解释方式执行字节码的。当这段代码被执行的次数足够多以后,它会被动态优化并编译成机器码

[转帖]Java方法的JIT编译

https://www.jianshu.com/p/a6275e239eac Java方法执行一般会利用分层编译,先通过c1解释执行。方法执行编译等级逐渐提升,有机会通过JIT编译为特定平台汇编执行,以此获得最好的性能。 方法执行除了达到一定热度外,是否JIT编译也受到以下两个参数影响: -XX:+

[转帖]java profile配置

[转帖]JAVA 编程规范之建表规约

1、【强制】表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint( 1 表示是,0 表示否)。 2、【强制】表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名

[转帖]Java使用火焰图查看系统瓶颈

场景 一般情况下,我们会对现有系统进行压测等方式,来了解系统最大的吞吐量等等,通过这种方式得知系统在生产环境下可扛住的压力,如果我们想了解在压测的链路过程中,是哪些地方执行时间过长,影响了系统的吞吐量,可以使用火焰图的方式来观察。 工具 生成火焰图需要两个工具: 1. async-profiler:

[转帖]java性能分析之火焰图

http://t.zoukankan.com/lemon-le-p-13820204.html 原由 最近因为kafka、zookeeper、ES和相关的Java应用的内存问题搞的头大,做运维将近4年,对Java调优、性能方面的知识了解的少之又少,是时候下定决心来对他多一个学习了。不能一口吃成一个胖