背景:
对于编码解码的计算过程一直没有去研究过。以前也看了大神写的编码解码的文章,当时看了似懂非懂,没有仔细去品味,没去实践。正应了那句老话:纸上得来终觉浅,绝知此事要躬行。
为什么有编码和解码?二什么时候会出现编码和解码?编码解码的算法是怎样的?
推荐两篇文章
http://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/
http://blog.csdn.net/baixiaoshi/article/details/40786503
已经回答的很好了,^^偷懒不写了。
基础知识:
unicode转换为utf-8编码的规则
Unicode UTF-8
0000-007F 0xxxxxxx
0080-07FF 110xxxxx 10xxxxxx
0800-FFFF 1110xxxx 10xxxxxx 10xxxxxx
如果字符对应编码值小于0x7F,则转换该为1个byte,最高位为0(0x7F转换为二进制为111111,7个1。不会出现最高位为1,最高位为1肯定大于7F。),该字符对应的二进制替换X,不足7位前面高位加0
编码值在0080到07FF字符,会转换为2个字节,并且第一个字节以110开头,第二个字节以10开头,字符对应的编码值转换为2进制后的数据,填充X。不足位数的高位加0
编码值在0800到FFFF字符,会转换为3个字节,并且第一个字节以1110开头,后面字节以10开头,字符对应的编码值转换为2进制后的数据,填充X。不足位数的高位加0
也就是说大于07XX编码值的字符,转换为字节时,第一个字节中连续1的个数表示该字符对应字节的长度
计算过程
String name = "中"; char[] chars = name.toCharArray(); //使用utf-8编码字符集 Charset charset = Charset.forName("utf-8"); CharBuffer charBuffer = CharBuffer.allocate(chars.length); charBuffer.put(chars); charBuffer.flip(); //字符编码为字节数组 ByteBuffer byteBuffer = charset.encode(charBuffer); byte[] charToBytes = byteBuffer.array(); System.out.println("chars.length:" + chars.length+";bytes.length:" + charToBytes.length); byte[] bytes = name.getBytes("utf-8");
运行后byte数组值,可通过debug查看
转换过程
“中”的unicode通过查unicode编码表可知为:4E2D(十六进制的数,附件是网上找的一个编码表),通过转换为二进制:100111000101101。4E2D落在了0800~ FFFF区间内,再依据前面转换规则填充x。
填充过程:
最后获得 11100100 10111000 10101101。
二进制到byte的换算过程
根据1个字节占8位,换算为字节数组[224,184,173],这和程序运行结果[-28,-72,-83],对不上,脑袋当时就卡了。然后一想不对呀,java中byte的范围是-128到127,手工算出来的是224,184,173这明显超出了byte数值的范围。又一想这都是按无符号数进行二进制转换为byte。查了下无符号数转换为有符号数的规则(也有说这是补码):最高位用来表示符号,其余按位取反再加1。
按位取反 加1
11100100--------------->10011011-------------> 10011100
最高位为符号位不参与计算,剩下的二进制0011100转换为十进制为 28,加上符号为-28
同理
10111000转换后的十进制为 :-72
10101101转换后的十进制为:-83
最终和程序运行结果一样。
相关推荐
不需要关心接受的字符串编码是UTF_8还是GBK,还是ios-8859-1,自动转换为utf-8编码格式,无需判断字符串原有编码,用法://处理编码String newStr = GetEncode.transcode(oldStr);
Java字符串编码查询及转换,可将常用的一些编码格式转换成utf-8
为大家提供Python的UTF-8编码查询表,大家可以对照左列的编码查询右列的汉字。 例:\u4e00对应汉字“一”
此文本文档是UTF-8字符集中汉字编码对照表,可以用于查看某个汉字在UTF-8编码集中的位置。此编码集对照表非官网下载,如需使用,请提前预估风险。另外,此对照表只用于学习研究,如需用到其他地方,后果自负。
由于项目需要,需要字符串转为XML文件,直接用Fileopen进行EncodingUTF8编码后,发现文件实际为UTF-8 BOM编码 问度娘发现有相同问题,但解决方式是利用新建一个UTF-8的TXT文件后,再进行COPY加内容。感觉这样操作...
很多人喜欢用CString 或std:string,但是他们的缺点是不能完成汉字各种类型之间的转换,提供三种类库ascString,ucsString,utfString以及工具utfCount,utf8_ucs2_t,tcf8_ucs4_t类库,用于各种字符串之间的直接转换`...
linux C/c++ 源代码,将中文字串与UTF-8格式字串相互转化,我在项目中使用的代码,完全可用
delphi-string互相转化为byte数组
请使用这款软件,直接将代码转换为UTF-8 注意: 1、xml不需要转换,因为xml默认是utf-8,在你新建的时候已经是正确的格式了 2、图片更不需要转换 3、bin目录,gen目录的直接忽略 4.只需要src目录的代码转换,请确保...
如果UNICODE字符由2个字节表示,则编码成UTF-8很可能需要3个字节,而如果UNICODE字符由4个字节表示,则编码成UTF-8可能需要6个字节。用4个或6个字节去编码一个UNICODE字符可能太多了,但很少会遇到那样的UNICODE...
GB2312编码与utf-8编码的字符串的转换,主要使用windows api函数MultiByteToWideChar和WideCharToMultiByte,代码简洁,经测试可用
utf-8转换工具是非常好用的一款工具,用于将中文转换成utf-8格式的字符
字符串a-z排序
介绍php字符串与byte字节数组转化类,转换一个String字符串为byte数组,将字节数组转化为String类型的数据,转换一个int为byte数组,从字节数组中指定的位置读取一个Integer类型的数据,转换一个shor字符串为byte...
Java解决UTF-8的BOM问题,使用“UnicodeInputStream”、“UnicodeReader”。
PowerBuilder9.0开发环境下,可以把UTF-8的编码转换为Unicode的编码格式,在pb9.0环境下测试通过。
在eclispe的项目中,有存在项目字符集和工作空间字符集不匹配,该jar只能将项目文件中的.java结尾的文件转为utf8编码,并且源文件必须为gbk编码的,否则乱码
utf-8 unicode gb2312 汉字编码
utf-8 ansi 字符互转 工具utf-8 ansi 字符互转 工具