`
liangguanhui
  • 浏览: 112934 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

五分钟Unicode简单入门

阅读更多

对于Unicode,相信每个javaer都不会陌生。不过对于各种各样的UTF8,UTF16,GBK,GB2312等各种名词,你可能会觉得糊里糊涂,希望读完这篇文章对你有所帮助。

 

首先我们要清楚一点,Unicode包含Unicode编码Unicode实现(或者叫传输方式),两者是不同的,而通常我们就最容易搞混这两件事。

 

Unicode编码的英文缩写是UCS;而Unicode传输方式缩写是UTF。从字面上是不是看出一点点东西?

 

先来说说UCS

 

目前,UCS标准有两种:UCS-2UCS-4。顾名思义,UCS-2就是用两个字节编码,基本上现在用的就是这个标准,UCS-4就是用4个字节(实际上只用了31位,最高位必须为0)编码,是为了防止将来2个字节不够用才开发的。UCS-22^16=65536个码位,UCS-42^31=2147483648个码位。

 

UCS实际是一种全世界字符编码的“超集”,目标是让全世界所有字符都可以在这套编码里面找到唯一的编码。全世界所有的文字都可以在这些码位上编码,而互不冲突。你可以理解为Unicode组织为各个地区分一些码位范围。按照UCS-2标准,全世界可表示的编码只有65536个码位。可能你会说不够啊,汉字都差不多这个数了。这个我就不清楚了,大概收录的都是常用汉字吧。

 

再次强调,不管哪一国的字符码均以2个(UCS44个)字节表示,在UCS里面的编码都是唯一的,全世界的UCS编码只有一套(当然只有一套,不然怎么叫标准)。

 

说完UCS,就来说说UTF。为什么有UTF呢?保存UCS不就直接把每个字节都保存下来就OK拉,那需要管那么多。其实我们从“传输方式”字面上就可以看出来,UTF实际上用于传输、保存

 

我们可以这样理解,Unicode在内存里,为了快速处理起来,所以定长是可以理解的;但当保存下来的时候,是否定长就是另外一回事了,可能用户更加关注的是文件的大小、传输的快慢等等。

 

或者说,UCS是你自己系统里面处理Unicode的,不关别人的是,但如果要跟别人交流数据,就要有一定的规范来传输比特流(就是数据啦),这个规范几时UTF。

 

进一步的,我们甚至可以这样理解,Unicode在内存处理的时候,是定长的,跟UCS对应,但保存成文件的时候(其实就是转化为具体的字节),就用UTF来编码。(可能有误,不过这样会比较好理解。)

 

目前我们接触比较多的UTF方式有两种UTF-16UTF-8UTF-16,顾名思义,就是用16位(两个字节)存储一个UCS-2编码。实际上,这种是最原始的存储方式,把UCS-2直接保存下来,对于少数字符会做一些特殊的处理,不过UTF-16UCS-2基本上是差不多的。

 

说到这里,不得不提一下BOM这个东东。例如“汉”字的Unicode编码是6C49,在运算的时候是没什么问题的,直接wchar_t ch = 0x6C49就可以了。但保存成文件就有问题了,究竟是0x6C 0x49(叫Little Endian,低位在前。别搞错,0x6C是低位)还是0x49 0x6CBig Endian,即高位在前)?于是就有了规定:在UTF-16前面加上两个特殊字符0xFF0xFE。如果顺序为0xFF 0xFE,那就是就是LE低位在前,否则就是BE高位在前。默认不添加就是指LE

 

其实读者可以用WinXP的记事本试试。如下图,ANSI对于我们来说就是GBKUnicode就是UTF-16LE),Unicode big endian就是UTF-16BE),UTF-8当然就是下面即将要介绍的UTF-8。可以把文章保存下来,用不同的编码保存,然后用UE看看十六进制。

 

虽然有UTF-16,不过欧美就不爽了:凭什么我为了你的汉字要多浪费一倍空间。于是,UTF8就出来了。UTF-8是一种不定长的UTFUCS-2怎么转换到UTF-8我就不细说了,网上google一大把。下图是UTF-8的分布图,可以看出来,对于传统的ASCII,只需要一个字节,大大节省了空间,不过对于另外一些文字就恰恰相反了,最长的占3个字节。

 

为了跟好地理解UCSUTF,读者可以回忆一下在Java里面Stringbyte[]的转换:

String s = new String(bytes, “utf-8”);

byte[] bytes = s.getBytes(“utf-8”);

实际上,我们可以这样理解,s对象里面存储的数据,就是UCS,而bytes变量,则是UTF

 

说完UCSUTF,相信读者你已经对Unicode有了各大致的理解了吗?(还没有?对不起,我已经没有存货了。)我们再来聊聊另外一个话题:支持Unicode

 

我们经常会听到:java支持Unicodepython也支持Unicode。到底什么是支持Unicode

 

我觉得,所谓支持Unicode,无非就是三方面:

 

1)有专门的数据类型存储UCS

 

2)方法、函数、相关逐渐支持UCS

 

3)能够正确处理各种UTF

 

其实,只要原生字符和字符串是UCS(就是说,用wchar_t表示字符,而不是用char),外加一些处理UTF的函数,其实就相当于支持Unicode了。

 

看看手表,应该就5分钟啦。

 

  • 大小: 15 KB
  • 大小: 13.3 KB
7
3
分享到:
评论
2 楼 summersmile 2009-12-23  
关于UCS和UTF-8的转换再阐述一下就更好了。
1 楼 starry198804265811 2009-12-23  
以前我太明白UCS和UTF的区别,看了你的文章我知道一些了。

相关推荐

    API入门系列之二_-Unicode还是ASCII.pdf

    ### API入门系列之二:Unicode还是ASCII #### Unicode与ASCII编码概述 在计算机科学领域,尤其是在Windows平台下的软件开发过程中,Unicode与ASCII编码是两个重要的概念。这两种编码方式旨在解决不同语言环境中...

    30分钟入门正则表达式

    标题 "30分钟入门正则表达式" 涉及的是一个快速学习正则表达式的基本教程,适合初学者在短时间内掌握基本概念和用法。正则表达式是一种强大的文本处理工具,常用于数据验证、搜索与替换、文本分析等多种场景。 描述...

    oracle入门很简单06.zip

    "Oracle入门很简单06.zip"这个压缩包显然旨在帮助初学者快速理解和掌握Oracle数据库的基础知识,特别是关于字符型数据类型及其处理方法。 在Oracle数据库中,字符型数据类型主要包括VARCHAR2、CHAR、NVARCHAR2和...

    json入门教程入门教程

    JSON 入门教程 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于纯文本,易于人阅读和编写,同时也易于机器解析和生成。JSON 数据格式具有简单性、灵活性和跨平台、跨语言的特点,使其在 Web...

    最简单的C#快速入门教程

    ### C# 快速入门教程知识点总结 #### 一、C# 语言简介与特点 - **C#** 是一种面向对象的编程语言,由微软公司于2000年首次发布,旨在结合C++的强大功能与Visual Basic的简单易用性。 - C# 设计之初就考虑到了与...

    Python入门教程 超详细1小时学会Python.pdf

    Python 入门教程超详细 1 小时学会 Python Python 是一种高级的、解释型的编程语言,广泛应用于人工智能、数据科学、网络开发等领域。下面是 Python 入门教程的详细知识点: 1. Python 的优点 Python 比其他语言...

    ireport快速入门指南.pdf

    5. 创建报表的步骤:从添加JDBC连接开始,到创建简单的报表,以及如何在报表中使用组件,例如添加数据源、子报表和图表等。 6. 解决报表问题:文档列举了一些常见的报表问题以及它们的解决方案,例如中文字体乱码、...

    简易Python基础教程 Python新手入门教程 Python基础入门教程 共19页.pdf

    这篇"简易Python基础教程"旨在为新手提供一个全面的入门指南,覆盖了从基本概念到核心概念的多个方面。 1. **Python的应用场合**: Python广泛应用于Web开发、数据分析、人工智能、自动化脚本、网络编程等多个领域...

    VBS脚本入门教程5

    - `unicode`:布尔值,指定创建的文件是否为Unicode编码格式。 2. **`WriteLine`**: - 用途:向文件写入一行文本。 - 参数: - `string`:要写入的文本。 3. **`Close`**: - 用途:关闭当前的TextStream...

    Python快速编程入门的课后习题答案(本人原创,通过测试完整准确)

    "Python快速编程入门的课后习题答案" Python 是一种高级的、解释性的编程语言,具有简单易学、开源、高级语言、可移植性、解释性、面向对象、可扩展性、丰富的库、规范的代码等特点。 Python 可以应用在 web 应用...

    经典简单json入门

    ### 经典简单的JSON入门详解 #### JSON简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其简洁性和易读性而被广泛应用于Web应用的数据传输中。相较于XML等其他数据交换格式,JSON的优势...

    json入门基础教程

    ### JSON入门基础教程:理解与应用 #### 一、JSON概览 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON是基于JavaScript的一个子集,它使用了...

    API编程入门指导.pdf

    本文通过对“API编程入门指导”文档的分析,深入探讨了Windows API编程的基础知识,包括数据类型、编码选择以及构建简单SDK程序的方法。对于希望在Windows平台进行软件开发的程序员来说,这些知识不仅是敲门砖,更是...

    Python语言入门(上).pdf

    4. 初学者友好:Python的语法简单明了,易于学习和理解,特别适合编程初学者。 5. 可读性高:Python的语法要求强制使用空白符(whitespace)作为语句缩进,使得代码可读性很高。 6. 易于维护:Python的代码库易于...

    C语言入门教程-阮一峰.pdf

    5. C11:2011 年,标准化组织再次对 C 语言进行修订,增加了 Unicode 和多线程的⽀持。 6. C17:C11 标准在 2017 年进行了修补,但发布是在 2018 年。新版本只是解决了 C11 的一些缺陷,没有增加新的特性。 C 语言...

    C#入门到精通

    C#入门到精通这本教材主要介绍了C#的基础知识,从基础类型到变量声明,再到预定义类型、类型转换、常用科学计算方法以及面向对象编程的基础,下面我将对这些知识点进行详细解读。 首先,C#的基本数据类型分为值类型...

Global site tag (gtag.js) - Google Analytics