从 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 属性的时候,自动使用UTF8
转自http://www.lupaworld.com/441/viewspace-354.html。
备注:
今天在用BeautifulSoup+ Mysql的时候.发现了许多问题,BeautifulSoup内部编码为UNICODE,而MYSQL读出的数据是UTF8,字符串在比较的时候,会出错,因此首先要把UTF8的数据DECODE成UNICODE。
在用MYSQL的escape_string函数时,需要将数据编码为UTF8,所以,为了方便,在整个程序最开始,就指定STR的编码:
reload(sys)
sys.setdefaultencoding("utf8")
这样,所有的字符串就都是UTF8了,不用再担心ASCII了。
以上内容太转自王河云
博客,存档备用
相关推荐
byte[] utf8Bytes = Encoding.UTF8.GetBytes(asciiString); byte[] unicodeBytes = Encoding.Convert(Encoding.UTF8, Encoding.Unicode, utf8Bytes); string unicodeString = Encoding.Unicode.GetString...
ASCII、Unicode、GBK和UTF-8字符编码的区别联系
ASCII Unicode 和 UTF-8 的区别 ASCII 码是美国在 20 世纪 60 年代制定的字符编码标准,它规定了 128 个字符的编码,每个字符对应一个二进制代码,共占用一个字节的后 7 位,最前面的 1 位统一规定为 0。ASCII 码...
std::string utf8_to_ascii(const std::string& utf8_str) { std::string ascii_str; for (char c : utf8_str) { if (c ) { // ASCII range ascii_str += c; } } return ascii_str; } ``` 3. UNICODE(UCS-2/...
ASCII_UNICODE_UTF8字符串互相转换的C++代码ASCII_UNICODE_UTF8字符串互相转换的C++代码ASCII_UNICODE_UTF8字符串互相转换的C++代码ASCII_UNICODE_UTF8字符串互相转换的C++代码ASCII_UNICODE_UTF8字符串互相转换的...
### 字符编码笔记:ASCII,Unicode和UTF-8 #### 1. ASCII码 ...从最初的ASCII编码到如今广泛采用的UTF-8,字符编码技术的演变不仅解决了多语言文本的处理难题,也为全球信息交流提供了坚实的基础。
字符编码笔记:ASCII、Unicode 和 UTF-8 本文主要介绍了字符编码的...本文从 ASCII 码、非 ASCII 编码、Unicode 和 UTF-8 等方面探讨了字符编码的历史发展和基本概念,旨在帮助读者更好地理解字符编码的原理和应用。
3. 丢失信息:从Unicode或UTF-8转换到ASCII时,非ASCII字符会被替换为问号(?)或丢失。 4. 保留BOM:UTF-8有一个可选的字节顺序标记(BOM),在某些情况下可能需要保留或去除。 总之,了解ASCII、Unicode和UTF-8...
2. **UTF-8到UNICODE**:解析UTF-8字节序列,根据字节的最高位判断字符的长度,然后将这些字节组合成对应的UNICODE码点。 转换过程中需要注意字节顺序,尤其是对于多字节的字符。在某些编程语言中,如Python,可以...
在易语言中,转换ASCII到Unicode主要涉及两个步骤:首先,将ASCII字符串的每个字符转换为其对应的Unicode值,然后将这些值表示为Unicode字符。由于ASCII是Unicode的一个子集,ASCII字符的Unicode值与ASCII码相同。...
UNICODE有多种实现方式,如UTF-8、UTF-16和UTF-32等,其中UTF-8是最常见的,它能很好地兼容ASCII编码,前128个字符与ASCII相同。 ASCII到UNICODE的转换通常发生在处理包含非ASCII字符的数据时。例如,如果你有一个...
### 字符编码:ASCII,Unicode和UTF-8 详解 #### ASCII编码:基础与限制 ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是计算机领域中最早广泛使用的字符编码系统之一,它...
字符编码是计算机处理文本的关键...总结来说,ASCII、Unicode和UTF-8编码分别代表了从基础的英文字符集到全球多语言字符集的演进,并通过UTF-8实现了一种高效且兼容的编码方式,使得现代计算机能够处理各种语言的文本。
ASCII、Unicode和UTF-8是计算机世界中处理字符编码的三种重要标准,它们各自有着不同的历史背景和设计目的,对于理解和处理多语言文本至关重要。 首先,ASCII(American Standard Code for Information Interchange...
byte[] utf16ToUtf8Bytes = Encoding.Convert(Encoding.Unicode, Encoding.UTF8, utf16Bytes); string utf8FromUnicode = Encoding.UTF8.GetString(utf16ToUtf8Bytes); Console.WriteLine($"GBK -> UTF-8: {utf8...
Unicode有多种实现方式,如UTF-8、UTF-16和UTF-32,其中UTF-8是最常用的一种,因为它具有良好的向后兼容性和空间效率。 在处理跨语言的文本数据时,可能会遇到ASCII和Unicode之间的转换需求。例如,一个ASCII编码的...
本文将深入探讨ASCII到Unicode的转换,以及涉及到的相关技术,如UTF-16和unescape函数。 首先,ASCII(美国信息交换标准代码)是最早且最简单的字符编码之一,它使用7位二进制来表示128个基本的西文字符,包括字母...
本文以故事的形式介绍了字符集和编码的发展历程,从ASCII到Unicode和UTF-8编码。 ASCII,全称为American Standard Code for Information Interchange(美国信息交换标准代码),最初是基于8位字节的编码系统,可以...
本文主要探讨了在Qt中如何进行UTF8、Unicode、GBK、ASCII、16进制字符和16进制数值之间的转换。 首先,让我们简单回顾一下各种编码格式: - ASCII:美国信息交换标准代码,包含128个字符,主要用于英文和西欧语言,...
UTF-8是最常见的Unicode实现,它使用可变长度的字节序列来表示码点,能兼容ASCII,且在处理英文文本时效率较高。 ASCII到Unicode的转换通常涉及到将ASCII码的7位二进制值扩展为Unicode的16位或32位格式。由于ASCII...