[读后感]Java 控制台运行 Jar 传参的编码问题

下面这版面,太让我纠结了,谁能帮调整一下,。。。

_________________

java -jar test.jar "一二一“

这样传进去的 "一二一“ 如果打印出来,会是乱码,可以加个 -Dfile.encoding=UTF-8 来指定参数作为什么字符编码传入。

java -Dfile.encoding=UTF-8 -jar test.jar "一二一“

这样,在 java 代码内打印出来的就不是乱码了。

另外:

String 表示一个 UTF-16 格式的字符串,其中的增补字符代理项对 表示(有关详细信息,请参阅 Character 类中的 Unicode 字符表示形式)。索引值是指 char 代码单元,因此增补字符在 String 中占用两个位置。

String 类提供处理 Unicode 代码点(即字符)和 Unicode 代码单元(即 char 值)的方法。

getBytes :这里的字符集,是将字符串编码成指定字符集的字节序列,而 java 中的字符串一定是UTF-8的,如上官方文档摘贴,不知道理解是否正确。

public byte[] getBytes(Charset charset)

使用给定的 charset 将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组。

此方法总是使用此字符集的默认替代 byte 数组替代错误输入和不可映射字符序列。如果需要对编码过程进行更多控制,则应该使用 CharsetEncoder 类。

参数:

charset - 用于编码 String 的 Charset

返回:

所得 byte 数组

从以下版本开始:

1.6

String:这里的字符集,是说明字节数组是按什么字符集编码出来的,通过这个字符集指定解析方法,以构造出 UTF-8 的 String 字符串。

public String(byte[] bytes, Charset charset)

通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。新 String 的长度是字符集的函数,因此可能不等于 byte 数组的长度。

此方法总是使用此字符集的默认替代字符串替代错误输入和不可映射字符序列。如果需要对解码过程进行更多控制,则应该使用 CharsetDecoder 类。

参数:

bytes - 要解码为字符的 byte

charset - 要用来解码 bytes 的 charset

从以下版本开始:

1.6

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

FEB 10TH, 2013 | COMMENTS

参考链接:

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

Java’s file.encoding property on Windows platform

How do you open a jar file on a mac?

more

遭遇乱码问题的来龙去脉

这两天写了一个 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’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.

Posted by yang3wei Feb 10th, 2013 Java相关

时间: 2024-10-15 14:08:06

[读后感]Java 控制台运行 Jar 传参的编码问题的相关文章

[Java] 可运行 jar 记录

在 Eclipse 上,通过 Export 选择 Java 下的 Runnable JAR file ,可以将项目导出一个可执行的 jar 包. 例子如下 1. Eclipse 项目只有一个文件 main/App.java package main; public class App { public static void main(String[] args) { System.out.println(" - - "); } } 2. 对着项目右击,Export -> Run

java - spring mvc 之传参@RequestParam @RequestBody @Pathvariable @RequestHeader注解

1. @PathVariable 当使用@RequestMapping URI template 样式映射时, 即 someUrl/{paramId}, 这时的paramId可通过 @Pathvariable注解绑定它传过来的值到方法的参数上. 示例代码: @Controller @RequestMapping("/owners/{ownerId}") public class RelativePathUriTemplateController { @RequestMapping(&q

java自动识别用户上传的文本文件编码

经常碰到用户上传的部分数据文本文件乱码问题,又不能限制用户的上传的文件编码格式(这样对客户的要求可能比较高), 只好自己想办法.  找了一部分java获取文件编码的. 要么就是识别错误. 要么就是只有一小段的代码,也不说具体引用了什么...我就在这里分享一下吧. 工具类就一个方法. main测试方法我就不写了. 貌似还不能上传附件...就弄到我的资源里去吧. 引用了.这两个jar类. chardet.jar cpdetector_1.0.10.jar package com.dxx.buscre

java动态获取上传文件的编码类型

package com.sjfl.main; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net

配置Tomcat解决URL传参引出的中文乱码问题

今天在写一个JSP页面时候,发现下面报错: <span style="font-size:18px;"> <a href="request.jsp?username=小七七">测试URL传参</a></span> 通常情况下,通过使用contentType和下面的就可以解决传参过程中的中文乱码问题,但是貌似URL传参还要设备别的东西. <% request.setCharacterEncoding("u

Js调用Java方法并互相传参

Js通过PhoneGap调用Java方法并互相传参的. 一.JAVA代码 写一个类,该类继承自Plugin并重写execute方法. import org.json.JSONArray; import android.app.Activity; import android.app.AlertDialog; import android.content.ActivityNotFoundException; import android.content.DialogInterface; impor

Java项目导出为jar包+导出第三方jar包+使用命令行调用+传参

Java项目导出为jar包+导出第三方jar包+使用命令行调用+传参 一.打包 情况1:不需要向程序传参数,并且程序没有使用第三方jar包 Eclipse上导出jar: 然后选择一个java文件作为入库,需要带main()主函数: 情况2:向程序传参数,并且程序没有使用第三方jar包 这种情形下打包和情况1是一样的 情况3:程序使用了第三方jar包 这种情况下的打包要复杂一些,需要把第三方jar包一起导出,可以使用eclipse的插件fat jar,很简便,但是fat jar只支持eclipse

运行jar文件并传参

在win系统的cmd下或linux系统的终端中用命令行运行jar文件并传递参数的命令: java  [-Xms128m -Xmx512m]   -jar   *.jar   参数1   参数2 --      //[ ]中内容可有可无 版权声明:本文为博主原创文章,未经博主允许不得转载.

爬虫5 scrapy框架2 全站爬取cnblogs, scarpy请求传参, 提高爬取效率, 下载中间件, 集成selenium, fake-useragent, 去重源码分析, 布隆过滤器, 分布式爬虫, java等语言概念补充, bilibili爬视频参考

1 全站爬取cnblogs # 1 scrapy startproject cnblogs_crawl # 2 scrapy genspider cnblogs www.cnblogs.com 示例: # cnblogs_crawl/cnblogs_crawl/spiders/cnblogs.py import scrapy from cnblogs_crawl.items import CnblogsCrawlItem from scrapy.http import Request class