`
Nutch2009
  • 浏览: 10680 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

写得很好的UTF-8解释(转载)

阅读更多
转自(http://learn.akae.cn/media/apas02.html#app-encoding.utf8)
为了统一全世界各国语言文字和专业领域符号(例如数学符号、乐谱符号)的编码,ISO制定了ISO 10646标准,也称为UCS(Universal Character Set)。UCS编码的长度是31位,可以表示231个字符。如果两个字符编码的高位相同,只有低16位不同,则它们属于一个平面(Plane),所以一个平面由216个字符组成。目前常用的大部分字符都位于第一个平面(编码范围是U-00000000~U-0000FFFD),称为BMP(Basic Multilingual Plane)或Plane 0,为了向后兼容,其中编号为0~256的字符和Latin-1相同。UCS编码通常用U-xxxxxxxx这种形式表示,而BMP的编码通常用U+xxxx这种形式表示,其中x是十六进制数字。在ISO制定UCS的同时,另一个由厂商联合组织也在着手制定这样的编码,称为Unicode,后来两家联手制定统一的编码,但各自发布各自的标准文档,所以UCS编码和Unicode码是相同的。

有了字符编码,另一个问题就是这样的编码在计算机中怎么表示。现在已经不可能用一个字节表示一个字符了,最直接的想法就是用四个字节表示一个字符,这种表示方法称为UCS-4或UTF-32,UTF是Unicode Transformation Format的缩写。一方面这样比较浪费存储空间,由于常用字符都集中在BMP,高位的两个字节通常是0,如果只用ASCII码或Latin-1,高位的三个字节都是0。另一种比较节省存储空间的办法是用两个字节表示一个字符,称为UCS-2或UTF-16,这样只能表示BMP中的字符,但BMP中有一些扩展字符,可以用两个这样的扩展字符表示其它平面的字符,称为Surrogate Pair。无论是UTF-32还是UTF-16都有一个更严重的问题是和C语言不兼容,在C语言中0字节表示字符串结尾,库函数strlen、strcpy等等都依赖于这一点,如果字符串用UTF-32存储,其中有很多0字节并不表示字符串结尾,这就乱套了。

UNIX之父Ken Thompson提出的UTF-8编码很好地解决了这些问题,现在得到广泛应用。UTF-8具有以下性质:

编码为U+0000~U+007F的字符只占一个字节,就是0x00~0x7F,和ASCII码兼容。

编码大于U+007F的字符用2~6个字节表示,每个字节的最高位都是1,而ASCII码的最高位都是0,因此非ASCII码字符的表示中不会出现ASCII码字节(也就不会出现0字节)。

用于表示非ASCII码字符的多字节序列中,第一个字节的取值范围是0xC0~0xFD,根据它可以判断后面有多少个字节也属于当前字符的编码。后面每个字节的取值范围都是0x80~0xBF,见下面的详细说明。

UCS定义的所有231个字符都可以用UTF-8编码表示出来。

UTF-8编码最长6个字节,BMP字符的UTF-8编码最长三个字节。

0xFE和0xFF这两个字节在UTF-8编码中不会出现。

具体来说,UTF-8编码有以下几种格式:

U-00000000 – U-0000007F:  0xxxxxxx
U-00000080 – U-000007FF:  110xxxxx 10xxxxxx
U-00000800 – U-0000FFFF:  1110xxxx 10xxxxxx 10xxxxxx
U-00010000 – U-001FFFFF:  11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 – U-03FFFFFF:  111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 – U-7FFFFFFF:  1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

第一个字节要么最高位是0(ASCII字节),要么最高两位都是1,最高位之后1的个数决定后面有多少个字节也属于当前字符编码,例如111110xx,最高位之后还有四个1,表示后面有四个字节也属于当前字符的编码。后面每个字节的最高两位都是10,可以和第一个字节区分开。这样的设计有利于误码同步,例如在网络传输过程中丢失了几个字节,很容易判断当前字符是不完整的,也很容易找到下一个字符从哪里开始,结果顶多丢掉一两个字符,而不会导致后面的编码解释全部混乱了。上面的格式中标为x的位就是UCS编码,最后一种6字节的格式中x位有31个,可以表示31位的UCS编码,UTF-8就像一列火车,第一个字节是车头,后面每个字节是车厢,其中承载的货物是UCS编码。UTF-8规定承载的UCS编码以大端表示,也就是说第一个字节中的x是UCS编码的高位,后面字节中的x是UCS编码的低位。

例如U+00A9(©字符)的二进制是10101001,编码成UTF-8是11000010 10101001(0xC2 0xA9),但不能编码成11100000 10000010 10101001,UTF-8规定每个字符只能用尽可能少的字节来编码。
分享到:
评论

相关推荐

    utf8的编码算法 转载

    同时,UTF-8在大多数现代操作系统和Web浏览器中得到广泛支持,能够很好地处理多语言环境,是Web开发的标准选择。 在实际应用中,开发者可能需要手动实现UTF-8编码转换的情况包括: - 当没有现成的库或函数可用时,...

    论坛弹幕播放器(DZ测试可用,可以简单修改移植到PHPwind)

    注: 下载后发现问题很多,所以我自己修改了一遍,剔除了代码中的大部分不合理的地方加入了控制最大弹幕数的,编码GBK测试无问题,utf-8未测试(应该是不会有问题的)。 此源码为最初版,后来还重写了记录吐槽者IP、...

    BB1407openwrt-RG100A_DB120-squashfs-cfe.bin

    上个月发布了个bash版的同步脚本,虽能与百度网盘之间实现上传、下载和同步,但性能不是很好,稳定性也不是那么完美,此后就想着如何能解决这两个问题,首先想到的是用C语言来写下,但是C语言写的要针对特定的设备...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    建立好后工程文件列表如下图。 2.新建对话框类,如下图,在新建中,选择Qt Designer Form Class。 3.选择Dialog without Buttons。 4.类名设为myDlg。 5.点击Finish 完成。注意这里已经默认将其加入到了我们刚建的...

    (帖内)-版权免责声明插件 for Discuz!7.0.rar

    特别是做论坛的,很多的资料都必须去转载其它媒体资讯网站的,但是每一次都会看到别人的网站都有一个版权声明,有时候看到好的资料想转也不是,不转又很可惜,后来我自己想了一个办法,就是在我们的网站上也写一个...

    latex-ctexfaq

    \begin{CJK}{UTF8}{gbsn} 这是一个中文示例。 \end{CJK} \end{document} ``` 24. **能否举一个简单的CJK中文排版例子?** - 使用CJK宏包进行中文排版,也需要加载宏包并设置字体。示例代码如下: ```latex ...

    springmybatis

    3. 创建mysql 测试数据库和用户表,注意,这里采用的是 utf-8 编码 创建用户表,并插入一条测试数据 程序代码 程序代码 Create TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `userName` varchar(50) ...

    洪恩在线成语词典小偷程序php版

    6. **UTF-8与GB2312编码**:UTF-8是一种广泛使用的字符编码,而GB2312是中国国家标准的字符集。由于本程序需要在中文环境下显示内容,因此需要将UTF-8编码的文本转换为更符合中文用户习惯的GB2312编码。 7. **...

    最好的asp CMS系统科讯CMSV7.0全功能SQL商业版,KesionCMS V7.0最新商业全能版-免费下载

    同时提供GBK和UTF-8软件包,用户可以根据需要把模板和语言包翻译成其他语言,为多语言环境的开发提供了便利,助你的站点迈向世界。 17 、支持多级管理权限控制,让网站多人维护更轻松 系统支持按频道和模块分别...

    简单的网页内容采集器(C#)

    <br>网页编码,不出意外的话,中国大陆都可以采用UTF-8 <br>爬取文件名的正则:呵呵 这个工具明显是给编程人员用的。正则都要直接填写啦。比如说cnblogs的都是数字的,所以写了\d <br>建表帮助:用户指定...

    Nginx安装包

    1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation=...

    everything

    相比而言,因为浏览器更为常用,并且支持搜索,默认的UTF-8编码识别率更高,所以推荐HTTP方式分享。无论是HTTP还是FTP,其端口、用户名、密码都是可以设定的。这样,你就可以在局域网内更放心的分享文件了。 除了与...

    后台管理系统

    如使用MySQL,字符集选择为utf8或者utf8mb4(支持更多特殊字符,推荐)。 执行数据库脚本。数据库脚本在database目录下。 在eclipse中导入maven项目。点击eclipse菜单File-Import,选择Maven-Existing Maven ...

    WordPress同步发布到百度空间的插件WP2HiBaidu

    有时候为了外链的增加,我们会做找第三方的BSP博客,做一些外链的工作,像百度空间应该就是很多朋友用到的第三方博客了,但是,我们在发布文章的时候之后,还要把相关的内容进行转载,才能发布到百度空间,着实会...

    WP主题:HotNewspro 2.72

    切记不能用操作系统自带的记事本修改中文模板, 否则会改变模版编码造成主题错位(中文模版编码为:UTF-8 无BOM)。 ■ 主题自带最新图片小工具,不支持添加自定义栏目的图片,只支持采用特色图片功能添加的图片。...

    JS组件Bootstrap Table使用方法详解

    new InputStreamReader(request.getInputStream(),"UTF-8")); StringBuilder sBuilder = new StringBuilder(""); String temp = ""; while((temp = bufr.readLine()) != null){ sBuilder.append(temp); }...

Global site tag (gtag.js) - Google Analytics