`

Utf-8编码是如何工作的 (转改)

阅读更多

关键字: 编码

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 7x 永远是0

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

第128(十进制)到2047个字节,要用10个bit来表示

[code="java"]
0 0 0 0 0 x10 x9 x8
x7 x6 x5 x4 x3 x2 x1 x0
[/code]

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

[code="java"]
1 1 0 x10 x9 x8 x7 x6
1 0 x5 x4 x3 x2 x1 x0
[/code]

第2048(十进制)到65535个字节,要用16个bit来表示,Utf-8把这些字节编成下面这样的三个byte
[code="java"]
1 1 1 0 x15 x14 x13 x12
1 0 x11 x10 x9 x8 x7 x6
1 0 x5 x4 x3 x2 x1 x0
[/code]

读一个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。剩下的自己算算。然后和这个程序的结果比较一下。
public class CharSetTest {

	
	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();="" }="" }="" <="" pre="">
 e5 93 88 
         0101 0100  1100  1000 
1110 0101 1001 0011 1000 1000
toHexString   ffffffe5,ffffff93,ffffff88具体怎么解释呢,搞的不清楚呀!大家多指点呀!
        
1
0
分享到:
评论

相关推荐

    项目编码修改, GBK 变UTF-8 , 全格式转UTF-8, 编码转utf-8

    请使用这款软件,直接将代码转换为UTF-8 注意: 1、xml不需要转换,因为xml默认是utf-8,在你新建的时候已经是正确的格式了 2、图片更不需要转换 3、bin目录,gen目录的直接忽略 4.只需要src目录的代码转换,请确保...

    PB9转换utf-8例子

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

    批量将文件编码方式由ansi转为utf-8

    标题"批量将文件编码方式由ansi转为utf-8"涉及到的是一个文件处理任务,即转换大量以ANSI编码存储的文件到UTF-8编码。这通常是由于ANSI编码不支持某些非英文字符,或者在跨平台交互时可能会遇到问题,而UTF-8编码则...

    UTF-8转ANSI文本文件转换器

    "UTF-8转ANSI文本文件转换器"就是这样一个工具,它能够帮助用户批量将UTF-8编码的文本文件转换为ANSI编码的文本文件。在此,我们将深入探讨UTF-8和ANSI编码的原理以及转换过程中涉及的关键知识点。 **一、UTF-8编码...

    utf-8/utf-16转换代码完整版

    最近需要对Linux与Windows平台下的字符传输出现乱码,对...参考了网上的UTF-8/UTF-16转换的资料,只有0x10000以下的Unicode编码进行了转换;对其代码进行了修改和补充,可以实现所有的UTF-8/UTF-16的转换,分享给大家。

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

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

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

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

    批量修改文本文件的编码方式至UTF-8或ANSI,可用于批量修改CUE格式文件

    它的优点在于兼容性好,大多数现代软件和网页浏览器都能很好地支持UTF-8编码,减少了乱码问题的出现。 相反,ANSI编码(通常指的是Windows默认的代码页,如Windows-1252)是特定地区的单字节编码,只包含有限的字符...

    bat脚本将csv格式UTF-8批量转ANSI

    标题中的"bat脚本将csv格式UTF-8批量转ANSI"指的是利用批处理脚本来自动化转换一批UTF-8编码的CSV文件为ANSI编码。批处理脚本是Windows操作系统中的一种简单程序,它由一系列命令组成,可以一次执行多个命令,节省了...

    易语言将文本转换为UTF-8码

    在处理文本数据时,易语言提供了丰富的函数和方法,其中之一就是将文本转换为UTF-8编码。 UTF-8是一种广泛使用的Unicode字符编码方案,它可以表示Unicode字符集中的所有字符。与GBK等其他编码相比,UTF-8在全球化和...

    GB2312转UTF-8(C代码)

    UTF-8的一个显著特点是兼容ASCII编码,对于ASCII字符,UTF-8编码与ASCII编码完全相同,仅用一个字节表示。对于非ASCII字符,UTF-8使用1到4个字节来表示,这样设计使得在多数英文为主的系统中,可以有效利用存储空间...

    日历脚本—utf-8编码

    UTF-8编码是一种广泛使用的字符编码标准,它能够支持Unicode字符集,包括全球几乎所有的文字系统。GBK和GB2312则是中文编码标准,主要针对简体中文字符。在描述中提到的情况,即“日历脚本”通常是指用于生成、显示...

    source insight 3.5 UTF-8中文乱码插件_sourceinsight3.5_utf-8_插件补丁_中文乱码_

    8中文乱码插件"是解决Source Insight 3.5与UTF-8编码不兼容问题的有效工具,通过正确安装和应用此插件,开发者可以更顺畅地在Source Insight环境中阅读和编辑包含中文字符的代码,提高工作效率。对于依赖Source ...

    jmeter5.0官网utf-8编码

    在"jmeter5.0官网utf-8编码"这个主题中,我们关注的是JMeter 5.0版本,并且源码已经修改为UTF-8编码,以解决在使用过程中可能出现的字符乱码问题。 JMeter 5.0是Apache JMeter的一个重大更新,它引入了多项改进和新...

    C#:批量修改文本编码为UTF-8(含源码)

    首先,我们要理解什么是UTF-8编码。UTF-8是一种广泛使用的Unicode字符编码方案,它可以表示Unicode字符集中的所有字符,且在网页和互联网上特别常见。UTF-8的一个特点是它兼容ASCII编码,前128个字符与ASCII编码相同...

    utf-8编码转换工具.zip

    该程序支持.c .h .cpp .hpp .bat .java等6种格式的文件编码转换,如果需要添加其他格式的文件,直接修改suffix的条件判断处的语句即可,压缩包中提供exe程序和python写的源码

    文本文件编码转换:ANSI、Unicode、UTF-8相互转换(修改版)

    ANSI --&gt; UTF-8 Unicode --&gt; ANSI Unicode --&gt; UTF-8 UTF-8 --&gt; ANSI UTF-8 --&gt; Unicode UTF-8 --&gt; Unicode big endian ansi转别的,不检验BOM,一律作为ansi编码进行转换 unicode转别的,首先检验BOM,不合格不...

    Java工程编码格式由GBK转化成utf-8(编码格式互转)

    Java工程编码格式由GBK转化成utf-8(编码格式互转) https://ymjin.blog.csdn.net/article/details/118769530

    winForm中进行Utf-8 及 GB2312转换

    1. **编码转换**:如果你有一个用Utf-8编码的字符串,想转换成GB2312,你需要先将Utf-8编码的字节流解码,然后再用GB2312编码。代码示例如下: ```csharp string utf8Str = "你的Utf-8字符串"; byte[] utf8Bytes = ...

    c语言gbk、utf8转换编码表及函数

    - 反之,从UTF-8转GBK则需要解析UTF-8编码的字节序列,找到对应的Unicode码点,再转换成GBK编码。 5. **转换函数示例** - `gbk_to_utf8()`函数可能接收GBK编码的字符串作为输入,返回转换后的UTF-8编码字符串。 ...

Global site tag (gtag.js) - Google Analytics