提起Java的字符编码及国际化问题,确实让人很头疼,几乎任何用到java的地方都会遇到他,而且表现出来又是多种多样的错误,让人头大。最近帮“博导”解决一个问题,又遇到了新的问题,System.out输出在Eclipse中是乱码,但是命令行可以正常显示。
这个具体问题倒是不难理解,Eclipse中的输出结果是模拟了操作系统的控制台,而这个模拟的控制台采取什么编码显示字符就是由Eclipse来控制了,有可能和系统的控制台使用的不是一个字符编码,所以才会产生乱码的问题。经过测试,发现“博导”系统的控制面板里的“区域和语言选项”中“标准和格式”选的不是中国,而是一个西欧国家,系统默认的字符集是cp1252,所以输出时的编码是cp1252,在Eclipse的控制台里就是一堆乱码。
整理一下对于java编码问题的认识:首先,是关于字符编码的知识,网上介绍的很多,而使用起来其实不需要知道编码的内部知识,知道有哪些编码和常用的匹配就可以了。
标准和格式 JVM默认字符集
中文(中国) GBK
中文(新加坡) GBK
中文(香港特别行政区) MS950
中文(澳门特别行政区) MS950
中文(台湾) MS950
以上是windows中中文的相关默认字符集,可以看到只有两种,基本是按照政治因素分布的。这个默认字符集会影响到我们的哪些方面呢?
源代码编码。如果你使用的是记事本来编写你的代码,那么由于它是一个文本文件,它的默认编码会受制于系统的默认字符编码。在没有特别指定的前提下,一般是GBK。而使用Eclipse开发,我们可以在Eclipse的设置里将Editor的编码设为UTF-8,来做到国际化。
代码中的硬编码字符。这个应该说和上一个是一个问题,只不过因为表现得比较明显,权且单独提出来说。比如我在源代码里写入了“汉字”这两个字符(用记事本来写,采取默认字符集,下同),并用javac编译。此时当我修改了系统的“标注和格式”设定后,如果修改后使用的默认字符集和原来的字符以不同,就会产生乱码问题。因为编译之后,“汉字”是使用原来的字符集保存的,而输出时会按照这个编码输出,但是此时系统的默认字符集已经不是原来的那个了,自然就不能正常解析,会出现乱码。特别是当原来的编码是GBK这种非西文字符集(一般容量比较大),而修改后成为ASCII类似的小字符集时,由于不能表示出所有的字符,汉字一般都会被用??替代,说明这些字符的编码已经超出了当前字符集的表示范围。
其他。其实可能还有很多,但是本文只涉及到以上几点。
粘一段我用来测试默认字符集的代码:
public class TestSystem { public static void main(String[] args) { System.out.println("ç³»ç»?å?符ç¼?ç ?ï¼?"+ System.getProperty("file.encoding")); System.out.println(new String("ç³»ç»?å?符ç¼?ç ?ï¼?" .getBytes("GBK"),System.getProperty("file.encoding"))+ System.getProperty("file.encoding")); }
(苦死我了,php的编码问题我暂时还没辙)
代码中GBK所代表的是当前(编译环境下)的系统默认字符集。编译之后,更改“标准和格式”,运行 java TestSystem就可以看到效果。第一行输出的是没有经过处理的汉字,会出现乱码。第二行是将汉字按照原始编码打散成Byte数组,然后按照当前系统默认字符集重组后的输出,不会出现乱码。这也是解决乱码问题的一个思路,就是利用String的String(byte[] bytes,String charsetName);方法来进行编码转换。另外,InputStream的构建方法里也可以指定字符编码,应该也是一个解决方法。
总之,解决java的字符编码问题首先需要明确的是你的问题中涉及到哪些编码,当前默认编码(不一定是系统的,而是JVM的)是什么,然后才好利用各种解决方法来解决。
希望以后不再被Java的字符编码问题所困扰,希望utf8可以一统天下!
分享到:
相关推荐
在Java中,每个字符串都有一个默认的字符编码,通常是平台相关的(例如,Windows系统通常默认使用GBK,而Linux系统则可能是UTF-8)。 Java提供了`java.nio.charset`包来处理字符编码。其中,`Charset`类是核心,它...
#### 二、Java中的字符串与字符编码 在 Java 中,`String` 类型是一种特殊的类型,它用来表示一系列字符的序列。Java 的 `String` 类内部是以 Unicode 编码存储的,这意味着每个字符都对应一个特定的 Unicode 码点...
Java默认使用Unicode编码,这是目前最广泛接受的字符集,包含几乎世界上所有语言的字符。Unicode有多种不同的编码形式,如UTF-8、UTF-16等。UTF-8是最常用的变体,它使用1至4个字节来表示一个字符,根据字符的不同...
Java默认使用Unicode(更具体地说是UTF-16)作为内部编码,这允许Java支持世界上几乎所有的字符。然而,在读写文件或与外部系统交互时,可能需要处理其他编码格式,如GBK,这是一个常见的中文编码标准。 GBK是GB...
Java中String类型与默认字符编码是Java编程语言中一个重要的概念。String类型是Java中最基本的数据类型之一,它用于表示文本数据。然而,在Java中String类型的默认编码方式一直是一个困扰程序员的难题。 Java中...
Java中的字符编码转换是编程实践中一个至关重要的概念,尤其是在处理多语言环境和跨平台交互时。Java通过统一采用UTF-16编码格式在JVM内部处理字符,简化了字符操作的复杂性。UTF-16是一种变长的Unicode编码,它可以...
#### 二、Java中的字符串与字符编码 在Java中,`String` 类型内部是以 Unicode 编码存储的。这意味着,所有的 `String` 对象本质上都是 Unicode 字符串。因此,当你在Java程序中创建一个 `String` 对象时,它默认...
默认 javac 使用平台缺省的字符编码类型来解析 JAVA 文件。 * 运行:编译后字符数据会以 UNICODE 格式存入字节码文件中。然后 eclipse 会调用 java 命令来运行此字节码文件。 3. 调用 System.out.println 来输出...
Java的跨平台性和不同系统平台的默认字符编码方法,使得字符编码问题变得尤为重要。要解决乱码问题,首先要了解字符的编码方式。常用的字符编码方式有ISO8859-1、GB2312、GBK、Unicode、UTF等。 ISO8859-1是一种单...
如果没有指定字符集,默认使用系统默认字符集。例如,将一个字符串从GBK编码转换为UTF-8编码时,可以先使用`getBytes("GBK")`将字符串转换为GBK编码的字节数组,然后再使用`new String(byte[], "UTF-8")`将字节数组...
由于不同的系统、平台以及网络环境中可能存在多种字符编码格式,这导致了在处理文本数据时可能会遇到编码不一致的问题。本文旨在深入探讨与Java相关的字符集编码知识,包括但不限于编码的基本概念、几种常见的字符集...
2. **设置系统默认编码**: 在 Java 应用程序启动时,可以通过 `-Dfile.encoding=UTF-8` 参数来设置系统默认编码为 UTF-8。 3. **统一字符集**: 尽量在整个应用中使用统一的字符集,如 UTF-8,减少字符集转换带来的...
Java字符编码系列三主要探讨了Java应用中遇到的编码问题,包括编码基础知识、Java与系统软件、URL、工具软件等方面的处理。文章通过“中文”二字举例,解释了不同编码方式如GB2312、Unicode、UTF-8的表示方法。 1. ...
当开发者保存Java源文件时,默认会采用操作系统的默认字符编码(通常是`file.encoding`属性定义的编码),例如GBK编码。这意味着Java源文件中包含了中文信息和其他英文程序代码,在被编译之前是以操作系统默认的`...
Java字符编码解析是一个重要的主题,尤其对于移动开发,如Android平台,因为良好的字符处理能力是构建国际化应用的基础。本文将深入探讨Java中的字符编码概念、常见的编码格式、以及如何在Java程序中正确处理字符...
在IT开发环境中,字符编码的正确设置至关重要,尤其是在使用集成开发环境(IDE)如MyEclipse时。MyEclipse字符编码的设置对于处理各种类型的文本文件,尤其是涉及到中文字符的文件,有着决定性的影响。本篇文章将...
在Java编程语言中,字符编码是一个至关重要的概念,它涉及到数据的存储、处理和传输。字符编码决定了如何将字符(如字母、数字、符号)转换为数字表示,以便计算机能够理解并操作它们。本篇文章将深入探讨Java中的...
在Java编程语言中,`URLDecoder`和`URLEncoder`是两个非常重要的工具类,主要用于处理URL中的中文字符和其他特殊字符。这两个类位于`java.net`包下,可以帮助开发者进行字符串编码和解码,确保数据在网络传输过程中...