从 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 属性)
转自http://www.lupaworld.com/441/viewspace-354.html
分享到:
相关推荐
byte[] utf8Bytes = Encoding.UTF8.GetBytes(asciiString); byte[] unicodeBytes = Encoding.Convert(Encoding.UTF8, Encoding.Unicode, utf8Bytes); string unicodeString = Encoding.Unicode.GetString...
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、GBK和UTF-8字符编码的区别联系
而UTF-8是一种变长的Unicode编码,它可以表示世界上几乎所有的字符,包括汉字和其他非英文字符,它使用1到4个字节来编码一个字符。 在Java Web开发中,UTF-8转ASCII的场景通常出现在需要与只支持ASCII编码的系统或...
ASCII_UNICODE_UTF8字符串互相转换的C++代码ASCII_UNICODE_UTF8字符串互相转换的C++代码ASCII_UNICODE_UTF8字符串互相转换的C++代码ASCII_UNICODE_UTF8字符串互相转换的C++代码ASCII_UNICODE_UTF8字符串互相转换的...
ASCII Unicode 和 UTF-8 的区别 ASCII 码是美国在 20 世纪 60 年代制定的字符编码标准,它规定了 128 个字符的编码,每个字符对应一个二进制代码,共占用一个字节的后 7 位,最前面的 1 位统一规定为 0。ASCII 码...
以下是一个易语言实现ASCII转Unicode的4行代码示例: 1. 定义ASCII字符串变量: ```易语言 .ascii_string = “Hello, World!” ``` 2. 创建Unicode字符串变量,并将ASCII字符串转换为Unicode: ```易语言 .unicode_...
3. 丢失信息:从Unicode或UTF-8转换到ASCII时,非ASCII字符会被替换为问号(?)或丢失。 4. 保留BOM:UTF-8有一个可选的字节顺序标记(BOM),在某些情况下可能需要保留或去除。 总之,了解ASCII、Unicode和UTF-8...
本文主要探讨了在Qt中如何进行UTF8、Unicode、GBK、ASCII、16进制字符和16进制数值之间的转换。 首先,让我们简单回顾一下各种编码格式: - ASCII:美国信息交换标准代码,包含128个字符,主要用于英文和西欧语言,...
Unicode有多种实现方式,如UTF-8、UTF-16和UTF-32,其中UTF-8是最常用的一种,因为它具有良好的向后兼容性和空间效率。 在处理跨语言的文本数据时,可能会遇到ASCII和Unicode之间的转换需求。例如,一个ASCII编码的...
字符编码笔记:ASCII、Unicode 和 UTF-8 本文主要介绍了字符编码的基本概念和历史发展过程,包括 ASCII 码、Unicode 和 UTF-8 的编码原理和特点。文章首先介绍了 ASCII 码的历史和编码原理,然后讨论了非 ASCII ...
### 字符编码笔记:ASCII,Unicode和UTF-8 #### 1. ASCII码 ASCII码是上个世纪60年代由美国制定的一套字符编码标准,用于规定英语字符与计算机内部二进制位之间的关系。在计算机内部,信息通常以二进制形式存在,...
byte[] utf16ToUtf8Bytes = Encoding.Convert(Encoding.Unicode, Encoding.UTF8, utf16Bytes); string utf8FromUnicode = Encoding.UTF8.GetString(utf16ToUtf8Bytes); Console.WriteLine($"GBK -> UTF-8: {utf8...
2. **UTF-8到UNICODE**:解析UTF-8字节序列,根据字节的最高位判断字符的长度,然后将这些字节组合成对应的UNICODE码点。 转换过程中需要注意字节顺序,尤其是对于多字节的字符。在某些编程语言中,如Python,可以...
UTF-8是最常见的Unicode实现,它使用可变长度的字节序列来表示码点,能兼容ASCII,且在处理英文文本时效率较高。 ASCII到Unicode的转换通常涉及到将ASCII码的7位二进制值扩展为Unicode的16位或32位格式。由于ASCII...
例如,你可以有一个函数`convertToASCII(const std::string& utf8Str)`,它接受一个UTF-8编码的字符串,将其解码并转为ASCII,丢弃无法映射的非ASCII字符。另一个函数`convertToUTF16(const std::string& asciiStr)`...
UTF8则是Unicode的一种编码方式,它使用1到4个字节来表示一个Unicode码点,对于ASCII字符(英文字符),UTF8使用单个字节,这使得UTF8与ASCII兼容,且在互联网上被广泛采用。 UTF8的特性包括: 1. ASCII兼容性:UTF...
UNICODE有多种实现方式,如UTF-8、UTF-16和UTF-32等,其中UTF-8是最常见的,它能很好地兼容ASCII编码,前128个字符与ASCII相同。 ASCII到UNICODE的转换通常发生在处理包含非ASCII字符的数据时。例如,如果你有一个...
1. `unicode_to_utf8(unsigned int code_point, char *utf8_buffer)`:此函数接受一个 Unicode 码点,然后将其转换为 UTF-8 字节序列,结果存储在 `utf8_buffer` 中。码点是无符号整数,表示 Unicode 字符的码值。 ...
MultiByteToWideChar(CP_UTF8, 0, &utf8Str[0], (int)utf8Str.size(), &unicodeStr[0], size); return unicodeStr; } ``` 以上代码展示了如何在C++中实现从Unicode到UTF-8以及从UTF-8到Unicode的转换。需要注意的...