问题描述:
程序涉及到国际化问题,httpclient抓回来的数据乱七八糟的乱码,在转了几次编码之后在Myeclipse下可以获取正常编码的源码(准确的说是能显示一大部分,少部分内容依然乱码),但是将程序移植到eclipse下先前的程序就出现了乱码(移植工作曾经尝试过以下几种形式:1,程序从myeclipse中导出,然后再从Eclipse中导入;2,将Eclipse工作空间切换到myeclipse工作空间。然后将工程编码设置为utf-8)。如果将myeclipse工程使用fatjar打包为可执行jar包,然后在windows下运行的话还是乱码。而在Linux环境下是正常的。
在Linux上执行定时任务的时候出现乱码(最早的时候系统为默认的环境,安装好的系统没有对环境设置进行修改,这时候程序运行良好,当安装了一些涉及到语言之类的包以后,程序异常)。
问题分析:
Myeclipse、Eclipse中的工程编码都是utf-8
windows环境编码GBK、Linux环境下没有出现异常时默认编码是utf8、异常时虽然 系统环境显示utf-8,但是因为安装了一些涉及系统环境的包之后,对编码为utf-8有些 许怀疑
程序中转换的最终编码utf-8
怀疑对象是程序运行环境的默认编码问题
在使用java自带工具Java virtualVM分析程序内存、线程使用情况时,意外发现JVM arguments一项中的参数对在Eclipse和myeclipse下运行程序有所不同:Eclipse里面得参数只有-Xmx1024m而myeclipse下的程序则多出一项:-Dfile.encoding=UTF-8
在启动程序时多加上-Dfile.encoding=UTF-8参数,程序Eclipse中乱码消失,Linux下定时任务执行的程序也没有乱码了
-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这个属性中获取的。个人感觉这个是最重要的一个因素。下面的三个可以看看。
/**
* Returns the default charset of this Java virtual machine.
*
*
The default charset is determined during virtual-machine startup and
* typically depends upon the locale and charset of the underlying
* operating system.
*
* @return A charset object for the default charset
*
* @since 1.5
*/
public static Charset defaultCharset() {
if (defaultCharset == null) {
synchronized (Charset.class) {
java.security.PrivilegedAction pa =
new GetPropertyAction("file.encoding");
String csn = (String)AccessController.doPrivileged(pa);
Charset cs = lookup(csn);
if (cs != null)
defaultCharset = cs;
else
defaultCharset = forName("UTF-8");
}
}
return defaultCharset;
}
在java.net包中的URLEncoder.java中的static块里面:
dfltEncName = (String)AccessController.doPrivileged (
new GetPropertyAction("file.encoding")
);
在javax.print包中的DocFlavor.java
static {
hostEncoding =
(String)java.security.AccessController.doPrivileged(
new sun.security.action.GetPropertyAction("file.encoding"));
}
在com.sun.org.apache.xml.internal.serializer包中的Encodings
// Get the default system character encoding. This may be
// incorrect if they passed in a writer, but right now there
// seems to be no way to get the encoding from a writer.
encoding = System.getProperty("file.encoding", "UTF8");
另外另一个网友的博客上面看到的:
http://yaojingguo.blogspot.com/2009/02/javas-fileencoding-property-on-windows.html
Java's file.encoding property on Windows platfor
This property is used for the default encoding in Java, all readers and writers would default to using 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 be not changed dynamically even this property can be changed. So the conclusion is that the default encoding can't change 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.
分享到:
相关推荐
- 在`web.xml`中注册这个过滤器,并配置初始化参数`encoding`为`UTF-8`,这样所有经过该过滤器的请求都会被设置为UTF-8编码。 ```xml <filter-name>SetCharacterEncodingFilter</filter-name> <filter-class>...
<jvmArguments>-Dfile.encoding=UTF-8 这将设置Maven插件的字符编码为UTF-8,解决乱码问题。 三、示例代码 以下是一个简单的示例代码,演示如何在SpringBoot项目中解决乱码问题: @RestController ...
-Dfile.encoding=UTF-8 -Duser.country=US -Duser.language=en ``` 这些参数告诉JVM使用UTF-8编码,并设定用户的国家和地区为美国,以确保相关本地化字符串也以UTF-8处理。 2. **设置工作空间编码**: - 启动...
在 Maven 命令中添加-Dfile.encoding=UTF-8 参数可以指定文件编码方式: `mvn clean package -Dfile.encoding=UTF-8` 在资源文件中添加 encoding.properties 文件可以指定资源文件的编码方式: `encoding=UTF-8` ...
JAVA_OPTS="-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8" ``` 这里的`JAVA_OPTS`环境变量用于设置Java虚拟机(JVM)的启动参数。`-Dfile.encoding=UTF-8`指示JVM使用UTF-8编码处理文件,包括日志输出;`-Dsun....
这段配置包含了几个关键的Java属性,如`-Djava.awt.headless=false`确保非无头模式运行,`-Dfile.encoding=UTF-8`设置字符编码为UTF-8,以及`-Dsun.awt.fontCONFIG.enabled=true`和`-Djava.awt.fonts=/usr/share/...
1. 在本地Tomcat的配置文件中找到logging.properties文件,并追加以下配置信息:java.util.logging.ConsoleHandler.encoding = UTF-8 二、IDEA配置中的编码设置 IDEA配置中的编码设置也可以解决中文乱码问题。具体...
-Dfile.encoding=utf-8 ``` 这行命令告诉Java虚拟机(JVM)使用UTF-8编码来处理文件,包括标准输入输出和错误流,从而确保控制台输出的中文字符能正确显示。 接下来,我们需要设置IDEA自身的文件编码。在IDEA的...
其中,`-Dfile.encoding=UTF-8`这一行非常重要,它指定了JVM启动时的文件编码格式为UTF-8,能有效防止中文乱码。 2. **配置项目使用的容器参数**: 如果你的应用是运行在如Tomcat这样的服务器容器上,你需要确保...
- **-Djava.util.logging.config.file=<路径>/logging.properties**:通过配置文件来指定日志记录的编码格式,例如在`logging.properties`文件中设置`java.util.logging.FileHandler.encoding=UTF-8`。 ##### 2. ...
其中,`-Dfile.encoding=UTF-8`是关键,它指定Java虚拟机使用UTF-8字符编码,从而确保输出内容正确显示中文。 2. **配置项目使用容器参数**: 如果你的项目是通过容器(如Tomcat)运行,还需要在容器的配置中指定...
对于运行在Tomcat服务器上的Java应用而言,可以通过设置`file.encoding`参数来指定系统的默认文件编码格式为UTF-8,从而避免中文乱码问题的发生。 #### 三、具体实施步骤 ##### 1. Windows环境下的配置方法 在...
`-Dfile.encoding=UTF-8`用于指定文件系统的字符编码;`-Duser.language=zh`和`-Duser.region=CN`则用于指定用户的语言和地区。 4. **保存并重启服务器**: - 完成配置后保存更改,并重启Websphere应用服务器以使...
- `-Dfile.encoding=utf-8`:用于设置Java虚拟机的文件编码为UTF-8。 - `-jar yourJarFile.jar`:执行名为`yourJarFile.jar`的JAR包。 通过这种方式,即使是在GBK编码的CMD环境中,也能正确解析UTF-8编码的数据,...
可以通过 `-Dfile.encoding=UTF-8` 参数来设定JVM的默认编码。 对于JSP,由于它涉及到网页的显示,处理中文字符会更复杂。当从数据库读取数据时,需要根据数据库的编码进行适当的转换。例如,如果数据库是UTF-8,...
- **操作**:在该文件中增加`JAVA_OPTIONS="${JAVA_OPTIONS}-Dfile.encoding=utf-8"`这一行代码。 - **解释**:这里的`JAVA_OPTIONS`环境变量是用来设置Java虚拟机启动参数的。通过添加`-Dfile.encoding=utf-8`参数...
在启动JVM时,添加`-Dfile.encoding=UTF-8`参数,确保整个运行环境使用UTF-8编码。 其次,当涉及文件读写或网络数据传输时,输出流和输入流的编码必须与预期编码一致。例如,当我们写入文件时,应明确指定输出流的...
6. **JVM设置**:确保Java虚拟机(JVM)的默认编码也是UTF-8,这可以通过在启动JVM时添加`-Dfile.encoding=UTF-8`参数实现。 除了上述方法,有时问题可能出在编译后文件上。"DDLTask.rar"这个压缩包可能包含了用于...
JAVA_OPTS="-Dfile.encoding=UTF-8 $JAVA_OPTS" ``` - 保存并重新启动Tomcat服务。 2. **修改MyEclipse的Tomcat配置**: - 在MyEclipse中,依次点击`Window` > `Preferences`。 - 选择`MyEclipse` > `Servers` ...