`
black_star
  • 浏览: 34411 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

从 ASCII 到 UTF-8 : 大话编码(无心收获却获益颇多呀!)

阅读更多
从 ASCII 到 UTF-8 : 大话编码
话说当年,老美搞出了ASCII编码,用8个bit表示一个字符,
解决了计算机存储人类语言的问题.

要说当时那帮人真是有点小家子气,只顾解决英语,数字和一些简单符号
的存储问题,压根就没想过中文啊,拉丁文啊,藏文啊啥的怎么存储的问题.

随着计算机越来越普及,这个问题也就越来越尖锐了,总不能让全世界人民
都使用英语吧?于是,有这么两个组织,一个曰ISO,一个曰unicode组织,就开始
想办法了...

unicode想的办法比较简单,不是1个byte不够嘛?咱用两个byte存,大概够了吧?
这就是unicode 1.0 的实现.

要说人家ISO就是大气,也可能决策者们没过过几十K内存的苦日子,
大笔一挥,不就是1个byte不够吗?用4个byte够了吧?再用个几百年也够了吧?
这就是 ucs-4 的雏型.

随着一些稀奇古怪的文字需要并入unicode,unicode的决策者有点冒汗了,
咱有这么多稀奇古怪的字母呢? 要不再加点, 用 2byte + 4 bit 来存吧..
那4bit做为头,这下就又能表示很多奇怪的文字了....
这就是 unicode 2.0 的雏型

现在有了两套风格迥异的编码方式, 到底该用那个呢?
于是 unicode 组织 和 ISO 组织 达成了协议,就是你中有我,我中有你,
ucs-4 尽管有 32 bit 编码空间,只用 20 bit ,和 unicode 保持统一,unicode不作修改
这就是 ucs-4 和 unicode 2.0 了,狼狈为奸的结果

后来在 2000 年 8 月 ,unicode 的工作人员为了显得自己不是吃白食的,
就小小修改了一下 unicode 2.0 的文档,做为unicode 3.0 发布了.没加一个新字符啊!!!!!!
(实际上, 有大约12种当前语言 和 数十种古代语言,如雅玛语,古希腊B类线形文字,
古波斯碶型文字还没有得到支持)


至此,编码方案算是统一了,接下来,咬牙切齿骂街的就变成程序员们了.
程序员的愤怒是有道理的,比如输入一篇100字的英文文章,如果用ASCII
编码,仅需要 100 byte ,而如果出现了哪怕一个古怪的字符而不得不用ucs-4 ,
就需要 400 byte ! 这对早期的程序员来说简直是灾难...就算对带宽有限得今天,
这也是个很重要得问题..

于是IETF推出了 UTF- 8 和 UTF-16 两种解决方案 (utf32用的太少,忽略)

utf 8 实际上是最聪明的编码方式,简单说,规则有三条
(1) ASCII 编码不变, 用 1 个byte 表示
(2) 一个 byte 不够 ,就用两个 byte
(3)两个还不够,就用三个byte,什么?还不够?
不可能,3个byte已经超过unicode 的表示极限了..你是外星人吗?

它带来了如下两大好处:
(1)平台无关性,windows下用UTF-8写的小说,别人在unix下照样能看..
(2)有标记位,一个字读不出来,不影响其他字.

utf 16 则是给笨一点的程序员准备的,简单说,规则有两条
(1) unicode 1.0 中的字符完全照搬 ,用2个byte
(2) unicode 2.0 继续照搬,   需要用 20 bit 表示的字符,用 2byte + 4bit 处理.

这下带来的可不是一点两点的坏处,
(1)由于是变长,且不按计算机字长(8bit)来变长,所以用utf16编码的
东东的解码就和CPU,操作系统的处理方式相关了,不利于交流
(2)一些本来具有特殊意义的字符无法被计算机正常处理
(3)以上两条就可以判它死刑了...其他害处不一一列举,

但是utf16最省空间倒是真的.毕竟是紧凑编码的,没有大段大段的000000000出现....

实际上,IETF比较希望UTF-8成为事实标准(RFC2279),
而UTF-16,也就是卖ISO和unicode个面子,实现一下而已(RFC2781)


而现实中,由于UTF-8的优异性能,得到了广泛的认可和使用.
比如现在大红大紫的XML,在XML1.0第二版规范中明确指出,
当用户没有指定XML文档的 encoding 属性的时候,自动使用
UTF-8编解码
(尽管我强烈建议大家注明 encoding 属性)


OK,大话结束!各位可以把西红柿,鸡蛋啥的扔上来了



后记:
这几天在网上看到了几位朋友在问这几个概念,就
写了这个随笔解释一下目前编码技术的大概.实际上,
我认为在大多数情况下,编码对程序员都是透明的,
就算需要使用,各软件平台也各自实现了比较好的编解码
接口,所以不必太死扣技术细节.
分享到:
评论

相关推荐

    ASCII 及UTF-8 与字符互相转换

    ASCII 和 UTF-8 是两种广泛使用的字符编码标准,它们在计算机科学中扮演着重要的角色,尤其是在文本处理和数据传输方面。这两个编码系统都是为了将人类可读的字符转化为计算机可以理解的形式,但它们的设计和使用...

    快速转码(UTF-8转ASCII)

    在上述代码中,我们首先获取了UTF-8和ASCII的`Charset`对象,然后创建了一个UTF-8编码器,并将UTF-8字符串编码为字节数组。由于ASCII只能表示128个字符,所以在转换过程中可能会遇到无法表示的字符,这时我们需要...

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

    首先,UTF-8(Unicode Transformation Format - 8 bit)是一种变长的Unicode编码,它使用1到4个字节来表示一个字符。UTF-8的优势在于对ASCII字符集的兼容性,前128个Unicode字符(包括英文、数字和常见符号)只需要...

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

    然而,如果你从其他编码格式(如ASCII或GBK)转换到UTF-8,就需要使用编码转换函数。例如,可以使用iconv库进行这样的转换。 在处理UTF-8字符串时,常见的操作包括: 1. **字符遍历**:由于UTF-8的多字节特性,...

    Patchwork UTF-8:处理UTF-8格式字符串的便携类库.zip

    Patchwork UTF-8是一个便携式C++类库,专门设计用于处理UTF-8编码的字符串。UTF-8是一种广泛使用的Unicode字符编码方案,能够表示Unicode标准中的所有字符,包括各种语言的字母、数字和符号。这个类库的出现是为了在...

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

    1. 将GB2312编码的字符串转换为UTF-8: ```csharp string gb2312String = "GBK编码的字符串"; byte[] gb2312Bytes = Encoding.GetEncoding("gb2312").GetBytes(gb2312String); string utf8String = Encoding.UTF8....

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

    3. UTF-8:一种变长的Unicode编码,用1到4个字节表示一个字符。对于ASCII字符,UTF-8编码与ASCII相同,都是单字节。UTF-8的特殊之处在于它包含一个字节顺序标记(BOM),即UTF-8+BOM,但大多数情况下,UTF-8无BOM更...

    ASCII Unicode 和UTF-8区别

    ASCII、Unicode和UTF-8是字符编码的几种不同标准,它们在历史发展中各司其职,具有各自的特点和用途。了解这三者之间的区别和联系,对于处理多语言文本数据尤为重要。 首先,让我们回顾一下ASCII编码标准。ASCII...

    PB9转换utf-8例子

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

    UTF-8 汉字码表

    这意味着,对于ASCII码范围内的字符(即从0到127的字符),在UTF-8中它们仍然只占用一个字节,且二进制表示与ASCII相同。这种兼容性使得UTF-8能够在继承ASCII优点的同时,拓展对全球各种语言的支持。 #### 汉字在...

    解决Invalid byte 1 of 1-byte UTF-8 sequence

    标题 "解决Invalid byte 1 of 1-byte UTF-8 sequence" 涉及的问题是关于字符编码不匹配引发的错误,通常在处理包含非ASCII字符的文本文件时出现。UTF-8是一种广泛使用的字符编码标准,能表示世界上大部分语言的字符...

    字符编码笔记:ASCII,Unicode和UTF-8

    ### 字符编码笔记:ASCII,Unicode和UTF-8 #### 1. ASCII码 ...从最初的ASCII编码到如今广泛采用的UTF-8,字符编码技术的演变不仅解决了多语言文本的处理难题,也为全球信息交流提供了坚实的基础。

    UTF-8汉字码表.txt

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

    UTF-8 Unicode GBK GB2312 编码之间的区别和联系

    - **定义**:UTF-8是Unicode编码方案的一种实现,它使用可变长度的字节序列来编码每个字符。英文字符使用单个字节(8位)编码,而其他语言的字符可能使用2到4个字节编码。 - **优点**: - 兼容ASCII编码,使得...

    中文-UTF-8编码转换器

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

    utf-8码转换器(转换成utf-8码)

    对于ASCII字符,UTF-8编码和ASCII编码相同,都是单字节,这使得UTF-8在处理英文文本时效率较高。 2. **SWT(Standard Widget Toolkit)**: SWT是Eclipse基金会的一个开源项目,它是一个用于创建跨平台GUI应用程序...

    UTF-8''ASCII

    这样的工具通常用于解决编码兼容性问题,例如,当需要将包含非ASCII字符的UTF-8文本转换为仅包含ASCII字符的格式时,或者反过来,将ASCII文本转换为UTF-8以便包含更多语言的字符。在编程中,这种转换可能是因为某些...

    实现ascii ,utf8,utf16三种编码之间的转换.zip

    对于非ASCII字符,UTF-8使用1到4个字节来编码,根据字符的Unicode码点大小来决定字节数。 **UTF-16编码**也是Unicode的一种实现,它固定使用2个字节(16位)来编码每个字符,对于基本多文种平面(BMP)内的字符,这...

    PB的utf-8转换

    PB的utf-8转换,包括加码解码等等 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

    UTF-8 编码转换工具

    UTF-8编码是一种广泛使用的字符编码标准,尤其在网络和计算机系统中扮演着核心角色。它能够表示Unicode字符集中的所有字符,包括世界各地的各种语言。UTF-8的优势在于其兼容性和效率,不同平台和语言通常都能无缝...

Global site tag (gtag.js) - Google Analytics