UTF-8和Unicode

107 views
Skip to first unread message

Yili Zhao

unread,
Nov 30, 2011, 11:50:03 PM11/30/11
to golang-china
大家好!
Go编程语言的源代码是采用UTF-8编码的Unicode文本,一直以来我都没有弄清楚什么叫做“UTF-8编码的Unicode文本”?既然是用UTF-8编码的,为什么不直接就称为UTF-8文本,而要称为Unicode文本?
请帮忙深入浅出的解释一下,谢谢!

--
Yili Zhao

Howard Fan

unread,
Nov 30, 2011, 11:55:59 PM11/30/11
to golang...@googlegroups.com
嘿嘿, 语义是重复了, 可我们也早都习惯了, 例如:

会议没有不隆重的;闭幕没有不胜利的
讲话没有不重要的;鼓掌没有不热烈的;
领导没有不重视的;看望没有不亲切的;
接见没有不亲自的;进展没有不顺利的;
完成没有不圆满的;成就没有不巨大的;
工作没有不扎实的;效率没有不显著的;
决议没有不通过的;人心没有不振奋的;
班子没有不团结的;群众没有不满意的;

领导没有不微笑的,问题没有不解决的;
事情没有不瞩目的,会谈没有不坦诚的;
反对没有不强烈的,交涉没有不严正的;
完成没有不超额的;竣工没有不提前的;
中日没有不友好的,中美没有不合作的;
节日没有不祥和的;妇女没有不解放的;
决策没有不英明的;路线没有不正确的;
扫黄没有不彻底的;行动没有不果断的;
形势没有不大好的;观点没有不赞同的;
气氛没有不友好的;信心没有不增强的;
粮食没有不丰收的,抗洪没有不英勇的;
贪官总是极少数的,群众总是受蒙蔽的;

干涉没有不粗暴的,遗憾没有不深表的
对抗总是没出路的,后果总是你来负的;
台读分子总是一小撮的,反话势力总是到处有的,
亡我之心总是不死的,美国人民没有不友好的,
态度没有不坚决的,措施没有不得力的,
成绩总是主要的,问题总是暂时的,
阿族武装总没好人的,塞族武装总没坏人的,
科斯图呢察总是美国豢养的,米络舍维奇总是冤枉的,

申奥没有不支持的,法律没有不公正的,
上述没有不驳回的,国家机密总没说得出定义的,
调研没有不深入的,贯彻没有不彻底的,
理论没有不高屋建瓴的,政策没有不鼓舞人心的;
大赛没有一次不冲击的,关键比赛没有一场赢的,
生命没有不宝贵的,抢救没有不及时的,
损失没有不惨重的,设计没有不合理的,
技术没有不先进的,论证没有不专家的,
检测没有不严格的,运行没有不可靠的,
系统没有不安全的,特色没有不中国的,

失误总是难免的,运动总是成效显著的,
问题总是历史造成的;创造利润没有小的,
带来利税没有少的,农业没有不遭灾的,
灾年没有不丰收的。江河没有不治的,
大水没有不发的,团结总是紧密的,
拥护总是一致的,旗帜总是高举的,
思想总是坚持的,道路总是曲折的,
前途总是光明的。社会总是在嘴边的,

初级阶段总是过不完的!工人下岗没有不再就业的,
成绩肯定是在领导的关心下取得的;
农民减负没有不奔小康的!
前总统没有不是老朋友的。

2011/12/1 Yili Zhao <pan...@gmail.com>:

> --
> 来自: Golang China 中文Go语言技术邮件列表
> 发言: golang...@googlegroups.com
> 在线: http://groups.google.com/group/golang-china?hl=zh-CN
>

george tso

unread,
Dec 1, 2011, 12:03:16 AM12/1/11
to golang...@googlegroups.com

Jay True

unread,
Dec 1, 2011, 12:41:56 AM12/1/11
to golang...@googlegroups.com
UTF-8 是编码方式,而 Unicode 是编码表。

简单来说,应该就是这样吧。

Oling Cat

unread,
Dec 1, 2011, 1:59:56 AM12/1/11
to golang...@googlegroups.com
UTF-8是变长编码,用一个字节表示ASCII字符,用两个字节表示西欧字符和一部分亚洲字符,用三个字节表示亚洲的大部分字符,,还有极小一部分几乎用不到的字符用四个字节表示。Unicode是定长编码,也是标准和规范,所有字符都用四个字节编码,即UTF-32。
(补充个小知识:Unicode的学名叫"Universal Multiple-Octer Coded Character Set",简称UCS,UCS是"Unicode Character Set"的缩写,所以UCS其实就是指Unicode。UCS有两种格式:UCS2和UCS4,UCS2就是用两个字节编码,所以其变长编码的实现又叫UTF-16,;UCS4就是四个字节编码,所以其编码实现又叫UTF-32。1byte=8bit应该知道吧?
按说一切都用Unicode就解决了,就算转换也是在ASCII字符前面加三个字节的0,比如ASCII单字节的0x20变成UTF-32四字节的0x00000020。但由于以前的C语言和Unix使用ASCII编码,而0x00在C语言里面是控制字符,所以定长的UTF-32和ASCII码不兼容,UTF-16虽然是变长的,但最小长度为2个字节,所以也同样不兼容。UTF-8虽然兼容了ASCII,但转换为UTF-16有一套规则,详细请看参考来源。
简而言之,Unicode是标准,UTF-8是Unicode标准中UCS2格式的一个实现+扩展,就像ANSI-C是标准,gcc是其实现+自己的扩展,你问的那句就像“某程序的源码是包含了gcc库的ANSI-C语言源码”一样。
--
参考来源:
--
Hello! This is Oling Cat!

Jay True

unread,
Dec 1, 2011, 2:05:42 AM12/1/11
to golang...@googlegroups.com
Unicode 和 UTF-32 可不是一回事啊。Unicode 表示的是一个整数和一个字符之间的对应关系,而 UTF-8、UTF-16、UTF-32 则是这个整数在计算机中的存储与处理方式。

chai2010

unread,
Dec 1, 2011, 2:10:47 AM12/1/11
to golang...@googlegroups.com
在 2011年12月1日 下午3:05,Jay True <gla...@gmail.com>写道:
Unicode 和 UTF-32 可不是一回事啊。Unicode 表示的是一个整数和一个字符之间的对应关系,而 UTF-8、UTF-16、UTF-32 则是这个整数在计算机中的存储与处理方式。

这个解释比较简洁易懂 :)

Unicode 是对应表. (和字典差不多)
UTF-8/UTF-16/UTF-32是编码方式. (针对计算机)
 


On Thu, Dec 1, 2011 at 2:59 PM, Oling Cat <olin...@gmail.com> wrote:
UTF-8是变长编码,用一个字节表示ASCII字符,用两个字节表示西欧字符和一部分亚洲字符,用三个字节表示亚洲的大部分字符,,还有极小一部分几乎用不到的字符用四个字节表示。Unicode是定长编码,也是标准和规范,所有字符都用四个字节编码,即UTF-32。
(补充个小知识:Unicode的学名叫"Universal Multiple-Octer Coded Character Set",简称UCS,UCS是"Unicode Character Set"的缩写,所以UCS其实就是指Unicode。UCS有两种格式:UCS2和UCS4,UCS2就是用两个字节编码,所以其变长编码的实现又叫UTF-16,;UCS4就是四个字节编码,所以其编码实现又叫UTF-32。1byte=8bit应该知道吧?
按说一切都用Unicode就解决了,就算转换也是在ASCII字符前面加三个字节的0,比如ASCII单字节的0x20变成UTF-32四字节的0x00000020。但由于以前的C语言和Unix使用ASCII编码,而0x00在C语言里面是控制字符,所以定长的UTF-32和ASCII码不兼容,UTF-16虽然是变长的,但最小长度为2个字节,所以也同样不兼容。UTF-8虽然兼容了ASCII,但转换为UTF-16有一套规则,详细请看参考来源。
简而言之,Unicode是标准,UTF-8是Unicode标准中UCS2格式的一个实现+扩展,就像ANSI-C是标准,gcc是其实现+自己的扩展,你问的那句就像“某程序的源码是包含了gcc库的ANSI-C语言源码”一样。
--
参考来源:
--
Hello! This is Oling Cat!

--
来自: Golang China 中文Go语言技术邮件列表
发言: golang...@googlegroups.com
在线: http://groups.google.com/group/golang-china?hl=zh-CN



--
chaishushan

Oling Cat

unread,
Dec 1, 2011, 2:27:19 AM12/1/11
to golang...@googlegroups.com
“UCS4就是用四个字节编码,所以其编码实现又叫UTF-32 。”哪里有一回事的意思= =?

--
Hello! This is Oling Cat!



Jay True

unread,
Dec 1, 2011, 2:36:03 AM12/1/11
to golang...@googlegroups.com
Unicode是定长编码,也是标准和规范,所有字符都用四个字节编码,即UTF-32。”

我是看到这句话,才会觉得你是这个意思的。

Oling Cat

unread,
Dec 1, 2011, 2:44:46 AM12/1/11
to golang...@googlegroups.com
额、确实,应该把“ ,即UTF-32 ”去掉,因为后面详细解释了,不好意思啊= =||

--
Hello! This is Oling Cat!



在 2011年12月1日 下午3:36,Jay True <gla...@gmail.com>写道:
,即UTF-32

Yili Zhao

unread,
Dec 1, 2011, 2:52:50 AM12/1/11
to golang...@googlegroups.com
在 2011年12月1日 下午3:10,chai2010 <chais...@gmail.com> 写道:
> Unicode 是对应表. (和字典差不多)
> UTF-8/UTF-16/UTF-32是编码方式. (针对计算机)

按这种方式,假设整数1024代表中文字符'语'字,所谓Unicode指的就是1024到'语'之间的对应关系;而这个整数存储在计算机里面,用几个字节来表示,就要看是采用UTF-8还是UTF-16,或者是UTF-32。如果采用UTF-8或者是UTF-16,那就用两个字节存储;如果使用UTF-32,那就使用四个字姐存储。
这种理解方式对吗?

--
Yili Zhao

Oling Cat

unread,
Dec 1, 2011, 3:05:09 AM12/1/11
to golang...@googlegroups.com
对,就这么简单。但UTF-8和UTF-16转换不是直接在前面加0,而是有一套规则,蛮简单的。

下面是Unicode和UTF-8转换的规则

Unicode                         UTF-8

0000 - 007F                    0xxxxxxx

0080 - 07FF                    110xxxxx 10xxxxxx

0800 - FFFF                   1110xxxx 10xxxxxx 10xxxxxx

例如"汉"字的Unicode编码是6C49。6C49在0800-FFFF之间,所以要用3字节模板:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 1100 0100 1001,将这个比特流按三字节模板的分段方法分为0110 110001 001001,依次代替模板中的x,得到:1110-0110 10-110001 10-001001,即E6 B1 89,这就是其UTF8的编码。

--
Hello! This is Oling Cat!



2011/12/1 Yili Zhao <pan...@gmail.com>

Jay True

unread,
Dec 1, 2011, 3:07:35 AM12/1/11
to golang...@googlegroups.com
差不多吧。不过 Unicode 的内容不止于此,还有像书写顺序之类的东东。同时,UTF-8 和 UTF-16 都是变长编码,UTF-16 跟 UTF-32 还有一个字节序的问题。

Howard Fan

unread,
Dec 1, 2011, 3:13:44 AM12/1/11
to golang...@googlegroups.com
字姐? Unicode是字符, utf8 是编码. Go 的 string 是 utf8 编码的 unicode 字符. 所以
len("姐") 是 3, 而 "姐"[0] 是 229, 而 []int ("姐") [0] 是 22992

参考 http://play.golang.org/p/GjMzBT9GeN
http://golang.org/doc/go_spec.html#String_literals
http://golang.org/doc/go_spec.html#Conversions


2011/12/1 Yili Zhao <pan...@gmail.com>:

Oling Cat

unread,
Dec 1, 2011, 3:15:14 AM12/1/11
to golang...@googlegroups.com
http://www.unicode.org/Public/6.0.0/charts/ 这个比较给力,CodeCharts.pdf包含了有史以来人类创造的一切符号,甚至包括甲骨文、古字母、象形文字和楔形文字
--
Hello! This is Oling Cat!



2011/12/1 Jay True <gla...@gmail.com>

Yili Zhao

unread,
Dec 1, 2011, 3:19:44 AM12/1/11
to golang...@googlegroups.com
不好意思,应该是“字节”,输入错了。

--
Yili Zhao

Howard Fan

unread,
Dec 1, 2011, 3:20:20 AM12/1/11
to golang...@googlegroups.com
唯独少了我们发明的二简字: http://zh.wikipedia.org/wiki/二简字

2011/12/1 Oling Cat <olin...@gmail.com>:

Howard Fan

unread,
Dec 1, 2011, 3:22:04 AM12/1/11
to golang...@googlegroups.com
没事, 所有幽默都是黑的, 所有笑话都凉了, 所有Unicode都 utf8 吧 :)

2011/12/1 Yili Zhao <pan...@gmail.com>:

chai2010

unread,
Dec 1, 2011, 3:38:10 AM12/1/11
to golang...@googlegroups.com
说到这个就想起VC的事情来,
现在VC支持UTF8, 但是要加个BOM.

真不知道是谁发明了这个带BOM的UTF8 
1E3.gif

Jay True

unread,
Dec 1, 2011, 3:43:08 AM12/1/11
to golang...@googlegroups.com
BOM 大概是为了 UTF-16 吧,为了字节序的问题。不过 UTF-8 确实没必要加这个。
1E3.gif

Oling Cat

unread,
Dec 1, 2011, 3:47:53 AM12/1/11
to golang...@googlegroups.com
呵呵,这个是在UTF-8,UTF-16,UTF-32之间选择文件内容编码没办法的办法,可以在维基百科上找到。
--
Hello! This is Oling Cat!



2011/12/1 chai2010 <chais...@gmail.com>
1E3.gif

shiwei xu

unread,
Dec 1, 2011, 3:58:31 AM12/1/11
to golang...@googlegroups.com
utf-8 是传输标准(或者是编码标准),而 unicode 是字符集,它表述的是一个编码支持的字符集合是什么。所以,gbk 不是 unicode 字符集,但 utf-8、utf-16 等都是 unicode 字符集。

2011/12/1 Yili Zhao <pan...@gmail.com>
--
来自: Golang China 中文Go语言技术邮件列表
发言: golang...@googlegroups.com
在线: http://groups.google.com/group/golang-china?hl=zh-CN



--
许式伟

Howard Fan

unread,
Dec 1, 2011, 4:17:59 AM12/1/11
to golang...@googlegroups.com
以前听说国家什么委的强制所有国内软件使用 gb2312或 gbk,不知是否真的贯彻过。也不知他们打算怎么改 windows 和 java 的utf16。

2011/12/1 shiwei xu <xushi...@gmail.com>:

Ying

unread,
Dec 1, 2011, 4:30:33 AM12/1/11
to golang...@googlegroups.com
加一个也挺好,不用猜了,搞得'联通'忒不爽的。
>> 真不知道是谁发明了这个带BOM的UTF8 <https://mail.google.com/mail/e/1E3>

>>
> --
> 来自: Golang China 中文Go语言技术邮件列表
> 发言: golang...@googlegroups.com
> 在线: http://groups.google.com/group/golang-china?hl=zh-CN
>

--
Regards,
Ying

chai2010

unread,
Dec 1, 2011, 4:33:02 AM12/1/11
to golang...@googlegroups.com
关键是加一个把一个好东西给搞破坏了.
支持加BOM的UTF8, 还不如只支持UTF-16

Yili Zhao

unread,
Dec 1, 2011, 7:58:45 AM12/1/11
to golang...@googlegroups.com
对了,所谓采用UTF-8编码的Unicode字符,还得看采用的文本编辑器吧?例如,使用Vim或者是Emacs编辑器,还需要将它们的编码方式设定为UTF-8,对吧?

--
Yili Zhao

Reply all
Reply to author
Forward
0 new messages