`
liuwenjie517333
  • 浏览: 25975 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

java 中文字符串,utf-8编码为byte数组的计算过程

阅读更多

背景:

 对于编码解码的计算过程一直没有去研究过。以前也看了大神写的编码解码的文章,当时看了似懂非懂,没有仔细去品味,没去实践。正应了那句老话:纸上得来终觉浅,绝知此事要躬行。

 为什么有编码和解码?二什么时候会出现编码和解码?编码解码的算法是怎样的?

         推荐两篇文章

 

                        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,则转换该为1byte,最高位为00x7F转换为二进制为111111,71。不会出现最高位为1,最高位为1肯定大于7F。),该字符对应的二进制替换X,不足7位前面高位加0

 

    编码值在008007FF字符,会转换为2个字节,并且第一个字节以110开头,第二个字节以10开头,字符对应的编码值转换为2进制后的数据,填充X。不足位数的高位加0

 

    编码值在0800FFFF字符,会转换为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],对不上,脑袋当时就卡了。然后一想不对呀,javabyte的范围是-128127,手工算出来的是224,184,173这明显超出了byte数值的范围。又一想这都是按无符号数进行二进制转换为byte。查了下无符号数转换为有符号数的规则(也有说这是补码):最高位用来表示符号,其余按位取反再加1

 

            按位取反                 1

11100100--------------->10011011-------------> 10011100

 

 最高位为符号位不参与计算,剩下的二进制0011100转换为十进制为 28,加上符号为-28

同理

        10111000转换后的十进制为 :-72

        10101101转换后的十进制为:-83

 

          最终和程序运行结果一样。

 

 

  • 大小: 87 KB
  • 大小: 14.1 KB
分享到:
评论

相关推荐

    关于JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换

    例如,将一个UTF-8编码的字符串转换为Unicode编码的字符串: ```java String utf8Str = "中文"; String unicodeStr = new String(utf8Str.getBytes("UTF-8"), "UTF-8"); ``` #### 6. 示例分析 - **从GBK到ISO-...

    JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换

    - **Unicode到UTF-8**: 同样以"a 中文"为例,转换为UTF-8编码后,字节数组为`0x61 0xE4 0xB8 0xAD 0xE6 0x96 0x87`。 - **UTF-8到Unicode**: 反向转换后,结果依然是"a 中文"。 ##### 3. Unicode与ISO-8859-1 - **...

    Java避免UTF-8的csv文件打开中文出现乱码的方法

    如果需要兼容多个Excel版本,可以使用UTF-8编码格式,并在文件头部输出BOM,即0xEF 0xBB 0xBF这三个字节。 Java避免UTF-8的csv文件打开中文出现乱码的方法是使用UTF-16LE编码格式,并在文件头部输出BOM。同时,需要...

    GBK与UTF-8之间的转换

    正确的转换方法是,首先将GBK编码的字符串转换成UTF-8编码的字符串,然后将UTF-8编码的字符串转换成十六进制的UTF-8编码。下面是一个使用Java实现GBK与UTF-8之间的转换的示例代码: ```java public class ...

    Java中字符串与byte数组之间的相互转换

    例如,对于UTF-8编码,可以使用位操作提取每个字符的字节表示。 **byte数组转字符串** 1. **方法一**:使用`new String(byte[], charset)`构造函数。此方法将字节数组恢复为字符串,需要指定正确的字符集。 2. **...

    【源代码】明解Java-UTF-8.rar

    《明解Java-UTF-8》是一门针对Java编程语言和UTF-8编码的课程,其课后提供的源代码旨在帮助学习者巩固所学知识,适用于初学者和希望深入理解Java的同学。UTF-8是一种广泛使用的字符编码标准,能够表示Unicode字符...

    java字符编码问题

    1. **UTF-8编码**:通过`name.getBytes("UTF-8")`获取到的byte数组长度为3,这是因为“你”这个汉字在UTF-8编码下占用了3个字节。 2. **UTF-16编码**:通过`name.getBytes("UTF-16")`获取到的byte数组长度为4,这是...

    utf8与string的相互转换

    例如,在Python中,字符串是不可变的序列,可以包含任何Unicode字符,包括由UTF-8编码的字符。在Java中,String类也是用于存储和操作字符序列,同样支持UTF-8编码。 实现UTF-8与字符串之间的转换通常需要特定的函数...

    String(含Hex)与Byte数组互相转换[代码]

    使用`getBytes()`方法,它会根据默认的字符编码(通常是UTF-8)将字符串转换为字节数组。例如: ```java String str = "Hello, World!"; byte[] bytes = str.getBytes(); ``` 2. 字节数组转字符串: 使用`new...

    java字符串的各种编码转换

    ### Java字符串的编码转换 在Java中,处理不同字符集之间的字符串转换是一项常见任务。尤其是在处理国际化应用时,理解并掌握各种字符编码格式变得尤为重要。下面将介绍几种常见的字符编码格式以及如何在Java中实现...

    java实现十六进制字符unicode与中英文转换示例

    例如,`new String(bs, "utf-8")`将字节数组`bs`解码为UTF-8编码的字符串。`substring`方法用于从原始字符串中提取出每两个字符(一个字节的十六进制表示),并使用`Integer.parseInt`将其转换为十进制整数,进而...

    java编码格式转换

    - 将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编码...

    java_字符编码 Javajava_字符编码问题

    这段代码中,`oldStr.getBytes("UTF-8")` 将字符串 `oldStr` 转换为 UTF-8 编码的字节数组。如果省略 `"UTF-8"` 参数,则默认使用系统的默认字符集进行转换。 **2. 字节数组到字符串的转换** ```java String ...

    关于java按字节截取带有汉字的字符串的解法

    在上述代码中,我们首先将字符串转换为UTF-8编码的字节数组,然后截取所需的字节数量,最后再将截取的字节数组转换回字符串。这种方法可以确保即使在处理汉字时也能正确截取字符串。 需要注意的是,不同编码方式...

    java字符集编码问题

    使用`getBytes("UTF-8")`方法,可以获得“中文”的UTF-8编码,即字节数组“e4 b8 ad e6 96 87”。 3. **从GBK编码恢复原字符串** 如果我们有字节数组“d6 d0 ce c4”,并已知它是GBK编码,可以使用`new String...

    JAVA里字符编码的探索与理解.txt

    例如,将字符串转换为UTF-8编码下的字节数组: ```java byte[] utf_8 = name.getBytes("utf-8"); ``` 对于UTF-16编码: ```java byte[] utf_16 = name.getBytes("utf-16"); ``` 值得注意的是,UTF-16编码还有两...

    java字符串编码转换

    例如,将一个GBK编码的字符串转换为UTF-8编码: ```java String oldStr = "你好世界"; byte[] gbBytes = oldStr.getBytes("GBK"); String newStr = new String(gbBytes, "UTF-8"); ``` 这里的 `getBytes` 方法用于...

    utf8转GB2312

    例如,可以使用以下代码片段将UTF-8编码的字符串转换为GB2312: ```csharp using System.Text; string utf8String = "UTF8编码的字符串"; byte[] utf8Bytes = Encoding.UTF8.GetBytes(utf8String); // 转换为GB...

Global site tag (gtag.js) - Google Analytics