背景:
对于编码解码的计算过程一直没有去研究过。以前也看了大神写的编码解码的文章,当时看了似懂非懂,没有仔细去品味,没去实践。正应了那句老话:纸上得来终觉浅,绝知此事要躬行。
为什么有编码和解码?二什么时候会出现编码和解码?编码解码的算法是怎样的?
推荐两篇文章
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编码的字符串转换为Unicode编码的字符串: ```java String utf8Str = "中文"; String unicodeStr = new String(utf8Str.getBytes("UTF-8"), "UTF-8"); ``` #### 6. 示例分析 - **从GBK到ISO-...
- **Unicode到UTF-8**: 同样以"a 中文"为例,转换为UTF-8编码后,字节数组为`0x61 0xE4 0xB8 0xAD 0xE6 0x96 0x87`。 - **UTF-8到Unicode**: 反向转换后,结果依然是"a 中文"。 ##### 3. Unicode与ISO-8859-1 - **...
如果需要兼容多个Excel版本,可以使用UTF-8编码格式,并在文件头部输出BOM,即0xEF 0xBB 0xBF这三个字节。 Java避免UTF-8的csv文件打开中文出现乱码的方法是使用UTF-16LE编码格式,并在文件头部输出BOM。同时,需要...
正确的转换方法是,首先将GBK编码的字符串转换成UTF-8编码的字符串,然后将UTF-8编码的字符串转换成十六进制的UTF-8编码。下面是一个使用Java实现GBK与UTF-8之间的转换的示例代码: ```java public class ...
例如,对于UTF-8编码,可以使用位操作提取每个字符的字节表示。 **byte数组转字符串** 1. **方法一**:使用`new String(byte[], charset)`构造函数。此方法将字节数组恢复为字符串,需要指定正确的字符集。 2. **...
《明解Java-UTF-8》是一门针对Java编程语言和UTF-8编码的课程,其课后提供的源代码旨在帮助学习者巩固所学知识,适用于初学者和希望深入理解Java的同学。UTF-8是一种广泛使用的字符编码标准,能够表示Unicode字符...
1. **UTF-8编码**:通过`name.getBytes("UTF-8")`获取到的byte数组长度为3,这是因为“你”这个汉字在UTF-8编码下占用了3个字节。 2. **UTF-16编码**:通过`name.getBytes("UTF-16")`获取到的byte数组长度为4,这是...
例如,在Python中,字符串是不可变的序列,可以包含任何Unicode字符,包括由UTF-8编码的字符。在Java中,String类也是用于存储和操作字符序列,同样支持UTF-8编码。 实现UTF-8与字符串之间的转换通常需要特定的函数...
使用`getBytes()`方法,它会根据默认的字符编码(通常是UTF-8)将字符串转换为字节数组。例如: ```java String str = "Hello, World!"; byte[] bytes = str.getBytes(); ``` 2. 字节数组转字符串: 使用`new...
### Java字符串的编码转换 在Java中,处理不同字符集之间的字符串转换是一项常见任务。尤其是在处理国际化应用时,理解并掌握各种字符编码格式变得尤为重要。下面将介绍几种常见的字符编码格式以及如何在Java中实现...
例如,`new String(bs, "utf-8")`将字节数组`bs`解码为UTF-8编码的字符串。`substring`方法用于从原始字符串中提取出每两个字符(一个字节的十六进制表示),并使用`Integer.parseInt`将其转换为十进制整数,进而...
- 将UTF-8编码的字节数组转换为Unicode字符串:`byte[] utf8s = {0xe4, 0xb8, 0xad, 0xe6, 0x96, 0x87}; String s = new String(utf8s, "UTF-8");` - **Unicode与ISO-8859-1之间的转换**: - 由于ISO-8859-1编码...
这段代码中,`oldStr.getBytes("UTF-8")` 将字符串 `oldStr` 转换为 UTF-8 编码的字节数组。如果省略 `"UTF-8"` 参数,则默认使用系统的默认字符集进行转换。 **2. 字节数组到字符串的转换** ```java String ...
在上述代码中,我们首先将字符串转换为UTF-8编码的字节数组,然后截取所需的字节数量,最后再将截取的字节数组转换回字符串。这种方法可以确保即使在处理汉字时也能正确截取字符串。 需要注意的是,不同编码方式...
使用`getBytes("UTF-8")`方法,可以获得“中文”的UTF-8编码,即字节数组“e4 b8 ad e6 96 87”。 3. **从GBK编码恢复原字符串** 如果我们有字节数组“d6 d0 ce c4”,并已知它是GBK编码,可以使用`new String...
例如,将字符串转换为UTF-8编码下的字节数组: ```java byte[] utf_8 = name.getBytes("utf-8"); ``` 对于UTF-16编码: ```java byte[] utf_16 = name.getBytes("utf-16"); ``` 值得注意的是,UTF-16编码还有两...
例如,将一个GBK编码的字符串转换为UTF-8编码: ```java String oldStr = "你好世界"; byte[] gbBytes = oldStr.getBytes("GBK"); String newStr = new String(gbBytes, "UTF-8"); ``` 这里的 `getBytes` 方法用于...
例如,可以使用以下代码片段将UTF-8编码的字符串转换为GB2312: ```csharp using System.Text; string utf8String = "UTF8编码的字符串"; byte[] utf8Bytes = Encoding.UTF8.GetBytes(utf8String); // 转换为GB...