这两天写了一个 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. Java遍历List和Map出现ConcurrentModificationException异常原因分析及解决方法

    Java遍历 List 和 Map 出现 ConcurrentModificationException 异常原因分析及解决方法 一.单线程 异常情况举例 只要抛出出现异常,可以肯定的是代码一定有错误 ...

  2. spring配置字符过滤器之后出现乱码的原因分析

    博客分类: servletspringtomat字符编码 今天在写程序时,前台利用GET方式向后端发出一个请求,里面含有中文数据,结果在后端显示的是乱码,此时就比较奇怪,spring里面也配了字符过滤 ...

  3. 关于get请求中文乱码的原因分析

    浏览器是怎么知道该按照哪种方式编码的? 浏览器向服务器请求数据的时候,服务器通过响应头中的content-type来告诉浏览器,发送的内容的编码格式.比如,我们在html页面里面加上如下的模拟响应头: ...

  4. web程序网页出现乱码的原因分析

    从第一次开始写web程序,自己还有身边同事开发出现乱码情况基本都没有消停过.估计以后还会一样继续. 这么些年,不断修修改改,也总结也归纳.程序从asp,asp.net,jsp,php,服务器从wind ...

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

    这里以Code::Blocks 10.5版本为蓝本进行说明. 首先,请在Code::Blocks里面输入标准的一个C程序: #include<stdio.h> #include<st ...

  6. tomcat 下jsp乱码的原因分析

    tomcat 下jsp乱码 我们先看一个例子(包含2个文件一个test.jsp , 和result.jsp): test.jsp <%@ page language="java&quo ...

  7. Linux下sqlite3乱码,sqlite中文乱码问题原因分析及解决

    在VC++中通过sqlite3.dll接口对sqlite数据库进行操作,包括打开数据库,插入,查询数据库等,如果操作接口输入参数包含中文字符,会导致操作异常.例如调用sqlite3_open打开数据库 ...

  8. kafka服务器连接出现:[NetworkClient.java:935] [Producer clientId=producer-1] Node -1 disconnected原因分析

    本人小白上路,在做仿牛客论坛项目的时候,在kafka发布消息这一块出现了这个问题: 如下图所示: 开始疯狂的循环,原因就是连接不到kafka,百度必应搜了一大堆,什么要添加host文件,什么要修改se ...

  9. java jar 源码乱码,java使用jar包时出现乱码的解决方法

    java使用jar包时出现乱码的解决方法 发布时间:2020-06-17 17:06:29 来源:亿速云 阅读:105 作者:元一 jar包是什么: jar(Java Archive,Java归档文件 ...

  10. 【报错】java -jar 命令启动后中文乱码

    文章目录 报错 解决 报错 我们在Windows下运行jar包时,常常会出现乱码,主要分为dos窗口输出的日志中出现乱码和程序返回数据出现乱码. 解决 一.dos窗口输出的日志中出现乱码 执行如下命令 ...

最新文章

  1. Chemistry.AI | 基于卷积神经网络(CNN)预测分子特性
  2. python matplotlib 简单用法
  3. 【网络安全】如何使用QueenSono从ICMP提取数据
  4. Spring IOC源代码具体解释之容器初始化
  5. SAP推出iPhone手机端企业智能管理应用
  6. 剑网服务器维护,12月31日服务器例行维护公告
  7. php找出函数定义位置,WordPress如何快速定位PHP函数所在文件位置及代码行号?
  8. 错误提示:ssh: Could not resolve hostname devsrv: Name or service not known
  9. css多个属性怎么写,具有多个属性的CSS过渡简写?
  10. linux下的shell脚本(基本)
  11. 利用Bootstrap Paginator插件和KnockoutJS完成分页功能
  12. mysql-connector-java 5.1.13,Java连MySQL,mysql-connector-java-5.1.13-bin.jar究竟要怎
  13. 2022 软件库APP源码前端 后端整套独立后台+搭建教程
  14. imp命令导入dmp文件问题
  15. c语言写32位编译器,MinGW32 GCC编译器 V8.1 32位免费版
  16. 工业互联网,姓工,名互
  17. 攻防世界mfw--详细笔记
  18. Kali报错SIOCSIFFLAGS:不允许的操作 解决办法
  19. 微信小程序——增删改
  20. Redis 高可用原理及部署方法

热门文章

  1. php中几个数组函数array_slice() array_filter array_unique() in_array()
  2. maven学习七之用户密码修改和添加用户
  3. 量子纠缠2——CHSH不等式
  4. S20_DAY20--课堂笔记
  5. Cglib动态代理实现原理
  6. jmeter元件的作用域与执行顺序
  7. 代码管理仓库项目任务计划
  8. 【转】git使用教程
  9. [BZOJ2038]小Z的袜子(莫队算法)
  10. (原)War3 脚本分析4-触发器