这两天写了一个 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= Test.jar
 来更改它。
另外,只有在启动 java 程序前通过传递参数来更改才有效,程序一经启动就无法再更改了。

这样的话,也就只有通过传递 jvm 参数的方式来做默认编码的变更了:

其一,写一个带 -Dfile.encoding=UTF-8 参数的脚本文件来启动;


其二,用 Jar
Bundler.app
 打包成 app,效率应该不如第一种方案。

原理其实都差不多,都只是将更改 jvm 默认编码的操作封装了起来,执行时就不用再手动键入了。

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


-Dfile.encoding
 解释:
在命令行中输入 java,在给出的提示中会出现 -D 的说明:

-D=
 # 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’s file.encoding property on Windows platform

This property is used for the default encoding in Java, all readers
and writers would default to use this property. “file.encoding” is
set to the default locale of Windows operationg system since Java
1.4.2. System.getProperty(“file.encoding”) can be used to access
this property. Code such as System.setProperty(“file.encoding”,
“UTF-8”) can be used to change this property. However, the default
encoding can not be changed dynamically even this property can be
changed. So the conclusion is that the default encoding can’t be
changed after JVM starts. “java -Dfile.encoding=UTF-8” can be used
to set the default encoding when starting a JVM. I have searched
for this option Java official documentation. But I can’t find
it.

How do you open a jar file on a mac?

You can indeed launch a jar file from the command line, with the
following command: 

java -jar yourfile.jar

As well as this you can assign “Jar Launcher” as the default app.
To use when you double-click a jar file, as follows (I don’t
believe you need the developer tools installed for
this): 
Click once on the .jar file in the Finder and then from the menubar
in the Finder select File -> Get Info”. Click on “Open with” and
from the popup menu select “Other”. A file browser window will
open. In this window, go to the /System/Library/CoreServices folder
and select ‘Jar Launcher’. Then make sure the “Always Open With”
checkbox is checked and then click Add. Then click the “Change all”
button so that any jar file will be opened automatically. Finally,
close the Info window and now when you double-click any of your jar
files they should run automatically.

Java -Dfile.encoding=UTF-8 出现乱码问题原因分析的更多相关文章

  1. Code:Blocks 中文乱码问题原因分析和解决方法

    下面说说修改的地方. 1.修改源文件保存编码在:settings->Editor->gernal settings 看到右边的Encoding group Box了吗?如下图所示: Use ...

  2. Java -Dfile.encoding=UTF-8 干掉乱码

    遭遇乱码问题的来龙去脉 这两天写了一个 Java 程序来玩,结果又遭遇了以前遇到过很多次的乱码问题,具体描述一下:在 Mac 系统里面,常用的 Java 程序启动方式有如下几种:1.通过 eclips ...

  3. c# 关于抓取网页源码后中文显示乱码的原因分析和解决方法

    原因分析:首先,目前大多数网站为了提升网页浏览传输速率都会对网站内容在传输前进行压缩,最常用的是GZIP压缩解压解压算法,也是支持最广的一种. 因为网站传输时采用的是GZIP压缩传输,如果我们接受we ...

  4. jvm启动参数设置 -Dfile.encoding=UTF-8 解决freemark乱码

    今天一个spring boot应用windows跑起来后页面显示乱码,加上jvm启动参数为utf-8后,页面显示正常.

  5. 采用DoGet方式提交中文,乱码产生原因分析及解决办法

    前段时间某功能在测试机器上出现乱码,情况如下:   现象:           调试搜索功能时,通过doGet方法提交到后台的中文参数在本地和开发测试机器上为乱码(Action层),在测试人员测试机器 ...

  6. 关于在Java中链接SQLServer数据库中失败的原因分析

    首先声明:笔者是Java的初学者,并且一值是走在自学的道路上,长久以来只有“度娘”相伴.(加入了各种Java学习群,基本没有热心帮人解决问题的.可以理解-_-!!!)大神级的人物就不必看拙文了,没有什 ...

  7. java内存泄露/溢出等常见问题模拟及原因分析

    Java 8:从持久代到metaspace 系统稳定性--OutOfMemoryError 常见原因及解决方法 java各种异常问题示例(附pdf下载): java.lang.OutOfMemoryE ...

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

    http://blog.csdn.net/telnetor/article/details/5555361 问题描述:程序涉及到国际化问题,httpclient抓回来的数据乱七八糟的乱码,在转了几次编 ...

  9. Android studio 配置file encoding 无效,中文乱码解决办法

    通过配置Android studio 配置file encoding 无效,中文乱码,问题出现在java编译的时候jack采用了默认编码(中文windows默认的GBK编码)而乱码,所以不管更改bui ...

随机推荐

  1. 对于Mybatis在C#.Net中个人使用的总结(一) Mybatis 的结果映射

    (图片中的文字上传之后就都看不清,我再图片的下边会用斜体字标清) 首先我在项目中使用Mybatis 是用XML完成映射的.至于XML这门语言,其实很简单的(对于入门来说,因为我是刚入门哈~),如果你还 ...

  2. User Managerment 职责不能使用的问题

    1.此职责默认的是没有启用授权的(grant),需要在系统管理员职责下搜索到对应的菜单,进行grant 2.就算授权后,用户还是不能进行操作,需要进行以下设置: 1. Log into the app ...

  3. qlserver、Mysql、Oracle三种数据库的优缺点总结

    这篇文章主要介绍了sqlserver.Mysql.Oracle三种数据库的优缺点总结,需要的朋友可以参考下   一.sqlserver优点:易用性.适合分布式组织的可伸缩性.用于决策支持的数据仓库功能 ...

  4. linux更新系统之后,删除多余的开机启动项

    实验环境是centos7,采用uefi的引导方式,启动管理软件是grub2 1. 进入 /boot 目录,应该可以发现许多文件的文件名是以 vmlinuz 开头,后面跟着版本信息,这些就是内核.我们要 ...

  5. 怎么学习C++?

    一个学习十年c++的建议如下: 其实学习C++的读书顺序应该是这样的(对于有C基础的朋友): C++ Primer Effective C++ Exceptional C++ Inside the C ...

  6. jquery 下拉菜单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. 对Alexia(minmin)网友代码的评论及对“求比指定数大且最小的‘不重复数’问题”代码的改进

    应Alexia(minmin)网友之邀,到她的博客上看了一下她的关于“求比指定数大且最小的‘不重复数’问题”的代码(百度2014研发类校园招聘笔试题解答),并在评论中粗略地发表了点意见. 由于感觉有些 ...

  8. SSAS更改默认端口号,使用非默认端口号的时候Olap连接字符串的格式

    Sql server的Analysis Service服务默认使用的是2382或2383端口,但是实际上我们可以通过配置文件手动更改SSAS使用其它端口号. 修改SSAS使用端口号的方法如下,找到你的 ...

  9. ADB server didn't ACK的解决方法

    异常信息如下: C:\Users\Administrator>adb devices* daemon not running. starting it now on port 5037 *ADB ...

  10. Windows下USB磁盘开发系列三:枚举系统中U盘、并获取其设备信息

    前面我们介绍了枚举系统中的U盘盘符(见<Windows下USB磁盘开发系列一:枚举系统中U盘的盘符>).以及获取USB设备的信息(见<Windows下USB磁盘开发系列二:枚举系统中 ...