博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
点评字符串编码认知
阅读量:5260 次
发布时间:2019-06-14

本文共 2838 字,大约阅读时间需要 9 分钟。

参考链接:
字符串重编码
这个问题说来比较简单,转码就一行搞定,不信你看看,但究竟为什么要转码,是个很深奥的问题,看例子:
import java.io.UnsupportedEncodingException; 


/** 
* 字符串转码测试 

* @author leizhimin 2009-7-17 10:50:06 
*/
 

public 
class TestEncoding { 

        
public 
static 
void main(String[] args) 
throws UnsupportedEncodingException { 

                System.out.println(
"转码前,输出Java系统属性如下:"); 

                System.out.println(
"user.country:" + System.getProperty(
"user.country")); 

                System.out.println(
"user.language:" + System.getProperty(
"user.language")); 

                System.out.println(
"sun.jnu.encoding:" + System.getProperty(
"sun.jnu.encoding")); 

                System.out.println(
"file.encoding:" + System.getProperty(
"file.encoding")); 


                System.out.println(
"---------------"); 

                String s = 
"熔岩博客"

                String s1 = 
new String(s.getBytes(), 
"UTF-8"); 

                String s2 = 
new String(s.getBytes(
"UTF-8"), 
"UTF-8"); 

                String s3 = 
new String(s.getBytes(
"UTF-8")); 

                String s4 = 
new String(s.getBytes(
"UTF-8"), 
"GBK"); 

                String s5 = 
new String(s.getBytes(
"GBK")); 

                String s6 = 
new String(s.getBytes(
"GBK"), 
"GBK"); 

                System.out.println(s1); 

                System.out.println(s2); 

                System.out.println(s3); 

                System.out.println(s4); 

                System.out.println(s5); 

                System.out.println(s6); 

        } 

}
 
输出结果:
转码前,输出Java系统属性如下: 

user.country:CN 

user.language:zh 

sun.jnu.encoding:GBK 

file.encoding:UTF-8 

--------------- 

熔岩博客 

熔岩博客 

熔岩博客 

鐔斿博鍗氬 

���Ҳ��� 

熔岩博客 


Process finished with exit code 0
 
以下是我对打印结果的理解:
大环境:JVM 的 file.encoding 属性的值为:UTF-8
表明代码文件中的中文是以 UTF-8 进行编码的
结论1:s1,s2,s3 都是差不多的:
依据1。getBytes() 等价于  getBytes(Charset.defaultCharset().toString());
则:getBytes() 等同于 getBytes("UTF-8")
依据2。String s = new String(byte[]) 等价于 String s = new String(byte[], defaultCharset);
则:new String(byte[]) 等同于 new String(byte[], "UTF-8");
关于s4,字符串编码已经由 UTF-8 转码为 GBK
如果这个被转换为 GBK 编码的字符串被放到  file.encoding=“GBK” 的代码编辑器里面,
我想 s4 应该是能够正常打印成中文的~
但是如前所述,本次案例的代码编辑器仅能正常显示UTF-8编码的汉字,
那么,尽管s4是那么的“表里如一”,也就只能受尽委屈了
关于s5,那句代码是等价于 String s5 = new String(s.getBytes("GBK"), "UTF-8"); 的
s 显然是 UTF-8 编码的汉字(
汉字只是字节数据按编码表映射出来的显示在你面前的符号,计算机内部其实他是字节数据
),
编码表就如同一个字典,由一个个的 “1或多个字节 <--> 符号(英文,汉字,韩文,日语等字符)” 键值对组成。
(1个字符可能不仅仅对应于1个byte字节。实际上,ASCII里面的每个符号都对应一个字节,汉字多是对应2到多个字节)。
很遗憾,因为全世界n多国家和种族部落,所以大家用的并非同一套编码表,不然就没有那么多编码的问题了~
我深深为这个问题折磨过很长一段时间,我也相信,还有不少人和我一样遭受着同样的烦恼~
先分析 s.getBytes("GBK") 这段代码,他做了这样一些事情:
把s分割成一个个的字符,形如:'熔','岩','博','客'。
然后,拿这些字符去查 GBK 这张字符编码表,
得到这些字符所对应的字节数据,这些字节数据加在一起便成了字节数组 byte[] 这种数据类型,第一小段分析完毕。
然后分析第二小段:new String(s.getBytes("GBK"), "UTF-8");
如上所述,s.getBytes("GBK") 得到了一个字节数组 byte[],
现在,又用这些字节去查 UTF-8 这张字符编码表,
和之前叙述过的情况比较相似,不过前面是用符号查字节,现在反过来了,使用字节去查所对应的符号,
而且,一个不容忽视的细节是:
现在用的这张表和前面所用的表已经不是同一张表了(前面是GBK表,后面是 UTF-8 表)~
下面已经不用我多赘述了,无疑解码出来的 java 字符串肯定是要乱套了。
(java中的编码和解码所指的是什么,我一直没得到过工整的答案。
我推测,字符串->字节=编码,反之为解码。依据:
我认为码应该是更为核心的东西——对于计算机而言,而字符作为映射出来的物件,显得没字节数据那么沉)。
关于s6,用上面的理论来加以推算,得到能够正常显示出来的中文是非常合理的!!
个人认知,如有不准确的论述,欢迎各位拍砖!!!
本文出自 “ang3wei” 博客,如需转载,请评论告知!

转载于:https://www.cnblogs.com/yang3wei/archive/2012/03/22/2739450.html

你可能感兴趣的文章
android 签名
查看>>
android:scaleType属性
查看>>
SuperEPC
查看>>
mysql-5.7 innodb 的并行任务调度详解
查看>>
shell脚本
查看>>
Upload Image to .NET Core 2.1 API
查看>>
Js时间处理
查看>>
Java项目xml相关配置
查看>>
三维变换概述
查看>>
vue route 跳转
查看>>
【雷电】源代码分析(二)-- 进入游戏攻击
查看>>
Entityframework:“System.Data.Entity.Internal.AppConfig”的类型初始值设定项引发异常。...
查看>>
Linux中防火墙centos
查看>>
mysql新建用户,用户授权,删除用户,修改密码
查看>>
FancyCoverFlow
查看>>
JS博客
查看>>
如何设置映射网络驱动器的具体步骤和方法
查看>>
ASP.NET WebApi 基于OAuth2.0实现Token签名认证
查看>>
283. Move Zeroes把零放在最后面
查看>>
Visual Studio Code 打开.py代码报Linter pylint is not installed解决办法
查看>>