`
jiang9885
  • 浏览: 11347 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
社区版块
存档分类

Utf-8编码是如何工作的

    博客分类:
  • java
阅读更多

关键字: 编码

Utf-8编码是如何工作的讲起。

(JVM规范第4.4.7提了一些,O'Reilly出的Java I/O里讲的比较详细,我手里的是第一版,在第14章,Mutillingual Character Sets and Unicode)

Java用的Unicode用两个字节表示一个charater,字母A用Hex表示是00 41, B是00 42,在一个纯英文的环境里面,直接存成Unicode的文件一半都是由零组成的,浪费资源。Utf-8的主要目的是对ASCII表格头128个字母优化,牺牲的是对中文字符的存储。

头128个字节(0到127),可以用七个bit来表示,x6 x5 x4 x3 x2 x1 x0.第八个bit永远是0

例子,A, 用Hex表示是00 41,去掉开头的零字节是Hex 41,转成二进制是 0100 0001。XP带的计算器可以在Hex和Binary
之间转换,自己试试。

第128到2047个字节,要用10个bit来表示

Java代码 复制代码
  1. 0  0  0  0  0 x10 x9 x8   
  2. 7 x6 x5 x4 x3 x2 x1 x0  
 0  0  0  0  0 x10 x9 x8
x7 x6 x5 x4 x3 x2 x1 x0


Utf-8就把这些字节编成下面这样的两个byte

Java代码 复制代码
  1. 1 1  0 x10 x9 x8 x7 x6   
  2. 1 0 x5 x4 x3 x2 x1 x0  
1 1  0 x10 x9 x8 x7 x6
1 0 x5 x4 x3 x2 x1 x0


第2048到65535个字节,要用16个bit来表示,Utf-8把这些字节编成下面这样的三个byte
Java代码 复制代码
  1. 1 1  1  0   x15 x14 x13 x12   
  2. 1 0 x11 x10 x9 x8 x7 x6   
  3. 1 0 x5 x4   x3 x2 x1 x0  
1 1  1  0   x15 x14 x13 x12
1 0 x11 x10 x9 x8 x7 x6
1 0 x5 x4   x3 x2 x1 x0


读一个Utf-8编码的array,如果第一个byte的高位是1110,那么要连读下面两个以 10 开头的byte。如果一个byte的高位是110,那么要连读下面一个以 10 开头的byte。
如果一个byte的高位是0,那么这个byte就是一个字符了。

可以做个练习,中文字"哈"的Unicode编码是Hex 54 C8,转成Utf-8是什么?

Hex 54 C8 转成十进制是21704,转成Utf-8后要用三个byte,找张纸,画三行,每行8个格子,第一行头四个格子填上1110,第二行头两个格子填上10,第三行头两个格子填上10。剩下的自己算算。然后和这个程序的结果比较一下。

Java代码 复制代码
  1. public class Test {   
  2.   public static void main(String[] args) {         
  3.     char c[] = { '\u54c8' };   
  4.     String ha = new String(c);   
  5.     byte b[] = null;   
  6.     try {   
  7.       b = ha.getBytes("utf-8");    
  8.     } catch (Exception e) { System.exit(-1);}   
  9.        
  10.     for(int i=0; i<b.length; i++) {   
  11.       System.out.print(Integer.toHexString(b[i]).substring(6) + " ");   
  12.     }   
  13.     System.out.println();   
  14.   }   
  15. }  
public class Test {
  public static void main(String[] args) {		
    char c[] = { '\u54c8' };
    String ha = new String(c);
    byte b[] = null;
    try {
      b = ha.getBytes("utf-8"); 
    } catch (Exception e) { System.exit(-1);}
	
    for(int i=0; i<b.length; i++) {
      System.out.print(Integer.toHexString(b[i]).substring(6) + " ");
    }
    System.out.println();
  }
}

转自:http://bigpanda.iteye.com/blog/31890
分享到:
评论

相关推荐

    UTF-8编码表

    如果UNICODE字符由2个字节表示,则编码成UTF-8很可能需要3个字节,而如果UNICODE字符由4个字节表示,则编码成UTF-8可能需要6个字节。用4个或6个字节去编码一个UNICODE字符可能太多了,但很少会遇到那样的UNICODE...

    utf-8.rar_c++ string utf-8_string to utf-8_utf_utf 8_utf-8

    在C++编程中,UTF-8编码是一种广泛使用的字符编码标准,它能够表示Unicode字符集中的所有字符。本文将深入探讨如何在C++中处理UTF-8字符串,并介绍相关的关键概念和技术。 首先,C++标准库并没有直接支持UTF-8编码...

    中文-UTF-8编码转换器

    标题中的“中文-UTF-8编码转换器”指的是一个软件工具,它的主要功能是帮助处理中文和其他特殊字符在UTF-8编码环境下可能出现的乱码问题。UTF-8是一种广泛使用的Unicode字符编码方案,它可以表示Unicode标准中的所有...

    GBK、UTF-8编码转换工具

    GBK、UTF-8批量文件3秒快速转码工具(支持GBK,UTF-8免费转换),UTF-8/GBK编码在线转换工具,压缩包可以有多目录与文件,如目录中有图片不会转码,但是会随转码好的文件一起打包下载。 使用帮助 . 上传压缩包(仅支持zip...

    UTF-8toGBK_labview编码gbk_LabVIEWUTF-8_utf-8toGbk_

    在LabVIEW编程环境中,"UTF-8toGBK.vi"这个程序可能是一个用户自定义的VI(Virtual Instrument),用于将UTF-8编码的字符串转换为GBK编码。LabVIEW作为一个图形化编程语言,提供了丰富的字符串处理函数,其中包括了...

    UTF-8编码转换器

    UTF-8编码是一种广泛使用的字符编码标准,它在信息技术领域起着至关重要的作用。这个“UTF-8编码转换器”工具旨在帮助用户方便地将文本数据从其他编码格式转换为UTF-8,确保数据在不同系统和平台之间的兼容性。 在...

    C# 生成xml文件,编码为utf-8方法

    C# 生成 XML 文件,编码为 UTF-8 方法 C# 生成 XML 文件,编码为 UTF-8 方法是指在 C# 编程语言中,使用特定的方法和类来生成 XML 文件,并将其编码为 UTF-8 编码格式的过程。这种方法常用于数据交换、配置文件、...

    PB9转换utf-8例子

    标题中的“PB9转换utf-8例子”指的是在PowerBuilder 9(PB9)环境下将数据从非UTF-8编码转换为UTF-8编码的一种解决方案。由于PB9本身不直接支持这种转换,开发者通常需要利用外部库或者特定的编程技巧来实现这个功能...

    中文字符 UTF-8 编码查询表

    为大家提供Python的UTF-8编码查询表,大家可以对照左列的编码查询右列的汉字。 例:\u4e00对应汉字“一”

    Delphi和JAVA进行TCPIP通信(用UTF-8编码)例子

    最近的项目(Delphi开发),需要经常和java语言开发的系统进行数据交互(Socket通信方式),数据编码约定采用UTF-8编码。 令我无语的是:JAVA系统那边反映说,Delphi发的数据他们收到是乱码,而我这边(Delphi7,...

    UTF-8 编码转换工具

    UTF-8编码是一种广泛...了解UTF-8编码的工作原理和应用场景,对于从事IT工作的人来说是必不可少的基础知识。在实际工作中,无论是开发网页、编写代码还是处理多语言文本,掌握UTF-8的使用都能大大提升效率和准确性。

    百度编辑器asp版UTF-8编码

    百度编辑器ASP版UTF-8编码是一个用于网页内容编辑的工具,它专为ASP(Active Server Pages)开发环境设计,并采用UTF-8编码标准。UTF-8是一种广泛使用的多字节字符编码,能够支持全球大部分语言,包括中文,使得...

    判断文本文件是否为UTF-8编码

    本资源主要关注如何判断一个文本文件是否采用UTF-8编码。 在Windows系统中,比如Windows 7旗舰版,我们经常使用Notepad.exe(记事本)来查看和编辑文本文件。在编程环境中,有时候我们需要编写代码来检查文件的编码...

    UTF-8编码和GBK编码互转,一个头文件搞定!跨平台不使用第三方库

    UTF-8编码和GBK编码互转,一个头文件搞定!跨平台不使用第三方库。只需要添加一些C语言标准的头文件即可实现俩种编码互相转换。摆脱第三方库移植问题。原理是将UTF-8编码的汉字、字母、符号、数字等转换成unicode...

    UTF-8 汉字码表

    ### UTF-8编码详解与汉字码表解析 #### UTF-8编码原理 UTF-8(Unicode Transformation Format - 8 bits)是一种变长字符编码,由Ken Thompson于1992年设计,旨在解决多语言环境下字符编码兼容性问题。其核心优势...

    SAS EG导入UTF-8编码的文本数据文件时的乱码问题解决方法

    UTF-8编码的文本文件在处理中文字符时,如果没有正确设置编码,可能会导致中文字符显示不正确,即出现乱码现象。SAS EG是一个图形用户界面的程序,它提供了数据管理、统计分析、报告创建等功能,但它在处理不同编码...

    UTF-8编码转化(Visual Basic)

    UTF-8编码是一种广泛使用的字符编码标准,它能够表示Unicode字符集中的所有字符。在Visual Basic编程环境中,处理UTF-8编码的文件或数据时,你需要理解如何读取、写入以及转换UTF-8格式的数据。以下是一些关键的知识...

    UTF-8汉字码表.txt

    ### UTF-8编码详解 #### 一、简介 在计算机科学领域中,字符编码是将字符映射到二进制数字的一种方式。其中,UTF-8(8位通用转换格式)是一种可变长度的字符编码,它兼容ASCII,并且能够表示Unicode标准中的所有...

    gb2312,utf-8,utf-8-bom等编码格式的互相转换

    UTF-8-BOM,全称是“UTF-8 Byte Order Mark”,它在UTF-8编码的文件开头添加了一个特殊的字节序列(0xEF, 0xBB, 0xBF)来标识该文件使用的是UTF-8编码。BOM主要用于帮助软件识别文件的编码,但并非所有UTF-8编码的...

    字符编码转换类,支持 ANSI、Unicode、Unicode big endian、UTF-8、UTF-8+Bom互相转换

    对于ASCII字符,UTF-8编码与ASCII相同,都是单字节。UTF-8的特殊之处在于它包含一个字节顺序标记(BOM),即UTF-8+BOM,但大多数情况下,UTF-8无BOM更常见。 在PHP中,进行字符编码转换可以使用内置函数,如`mb_...

Global site tag (gtag.js) - Google Analytics