天天看点

【Java编程高级进阶】java 获取 string 字符串的编码详解

最简单的方法就是:Charset.defaultCharset();

Servlet中可以使用:request.getCharacterEncoding();

也可以使用上文提到的,不过也不那么简单:

也有一些其它方式可以参考,如下面这个就比较麻烦了!

纠正对”Charset.defaultCharset()“的错误理解,”Charset.defaultCharset()“方法的注释内容是返回此Java虚拟机的默认字符集。默认字符集在虚拟机启动期间确定,并且通常取决于底层操作系统的区域设置和字符集。而字符串的编码是受来源影响的!

使用”System.getProperties()“ 可以得到如下几种编码相关的属性:

file.encoding.pkg=sun.io

sun.jnu.encoding=GBK

file.encoding=UTF-8

sun.io.unicode.encoding=UnicodeLittle

sun.cpu.endian=little

sun.jnu.encoding 猜测是系统的默认编码,参考:

file.encoding 处理文件内容默认使用的编码;

使用Eclipse main 方法测试时,会自动根据文件内容的编码确定启动JVM使用的编码,如下图:

【Java编程高级进阶】java 获取 string 字符串的编码详解

如果在这里配置了和文件编码不同的编码方式,文件中的字符串输出可能就会产生乱码,如下面的代码输出为:

ISO-8859-1

?????????? ?????18

由于文件的编码是”UTF-8“,而调试配置的是:ISO-8859-1

上面的代码我们创建一个名为 ”CharsetTest3.java“的文件,在CMD下编译执行:

打开CMD,切换到文件所在目录:

没有指定编码,与系统默认不符!

使用”-encoding utf-8“指定编码,执行成功。

注意:在CMD在测试的时候最好不要使用包名,不然很麻烦,我真想说恨死Java了(包的查找方式太恶心,或许是因为性能考虑所以写的这么死板)。

【Java编程高级进阶】java 获取 string 字符串的编码详解

我的文件完整路径是:D:\javaProject\javatrans\src\main\java\wasdev\sample\servlet\CharsetTest3.java

可以通过” -Dfile.encoding=utf-8“指定编码方式

【Java编程高级进阶】java 获取 string 字符串的编码详解

但是CMD应该是使用的GBK编码,不支持韩文,我们把韩文复制粘贴到CMD窗口中发现这一点:

只见光标后移了,却看不见内容。

sun.cpu.endian=little CPU的字节序为小结尾,这涉及到”主机字节序和网络字节序“的问题,通常主机字节序为小结尾(Little endian:将低序字节存储在起始地址),网络字节序为大结尾(Big endian:将高序字节存储在起始地址)。但不同的处理器(CPU)、操作系统也有可能不同。

优化后的方法:

说明:把”UTF-8“放在第一位是因为现在使用的比较普遍,见下图:

【Java编程高级进阶】java 获取 string 字符串的编码详解

显示Google记录的2001年至2012年网络上主要编码的使用情况。参考:https://en.wikipedia.org/wiki/UTF-8测试代码:

执行输出为:UTF-8

UTF-8注意:如果将数组”String encode[]“中”UTF-8“和”GB2312“的位置换一下,结果就会发生改变为:

GB2312

UTF-8

这是为什么?通过监视以下代码中的”destination.getBytes“,我们可以发现是存在重码区域的!

如下图:

【Java编程高级进阶】java 获取 string 字符串的编码详解

所以”getEncoding“方法的正确性有是局限性的,一方面是数组中包含的编码的各类是否够全,一方面是需要判断的字符串特征是否明显。

======================文档信息===========================

版权声明:非商用自由转载-保持署名-注明出处

署名(BY) :testcs_dn(微wx笑)

文章出处:[无知人生,记录点滴](http://blog.csdn.net/testcs_dn)