廖雪峰老师的python教程里的一段关于编码文字的困惑

苦逼码农 2015-12-13 09:39:49
http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431664106267f12e9bef7ee14cf6a8776a479bdec9b9000


从上面的表格还可以发现,UTF-8编码有一个额外的好处,就是ASCII编码实际上可以被看成是UTF-8编码的一部分,所以,大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作。

搞清楚了ASCII、Unicode和UTF-8的关系,我们就可以总结一下现在计算机系统通用的字符编码工作方式:

在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。

用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件:






这里提到unicode是在内存中,感觉有些奇怪,

utf-8本身就是unicode的一种编码了,为什么要转换unicode字符到内存中?

其他语言也这样子吗?

好像没有吧。 至少c++没有吧。

...全文
299 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
苦逼码农 2015-12-15
  • 打赏
  • 举报
回复
引用 6 楼 pcboyxhy 的回复:
[quote=引用 5 楼 u012879787 的回复:] [quote=引用 4 楼 pcboyxhy 的回复:] [quote=引用 3 楼 u012879787 的回复:] [quote=引用 2 楼 pcboyxhy 的回复:] Java里面也有同样的概念,C/C++语言本身没有这个概念。Unicode是一个表,映射了 数值 => 字符。unicode数值存储到文件或者跟其它程序交互的时候,需要序列化,于是有了UTF-8,UTF-16BE/LE,UTF-32等不同的序列化方式。Python和Java提供了标准的Unicode(UCS2/UCS4)处理机制,先转换成unicode再处理,可以只提供unicode的方法,不用为UTF-8/16/32分别提供一组方法。 这也不是强制的,你完全可以读取utf-8,然后直接处理utf-8再写入,没有转换的过程,只不过你得自己实现或者用支持utf-8的专用方法。
1. 谢谢 2. UTF-16BE/LE,UTF-32 ,为什么只有utf-16才分大端,小端, utf-32, utf-8不分? 3. 标准的Unicode(UCS2/UCS4)处理机制,我不知道你从什么地方得知这句话? 据我所知, unicode和iso是2套系统,iso搞了一个ucs, 后来合成一个,所以 utf-16兼容ucs-2, ucs-2表示的字符数很少, utf-16是有代理的概念,所以可以存储很多字符。 4. 再次看看新的问题,谢谢。[/quote] 只有UTF-8没有byte order,其它都有大小端之分。 python2编译的时候有个参数,让你决定用ucs2还是ucs4
python2.7-2.7.11$ ./configure --help | grep unicode
  --enable-unicode[=ucs[24]]
[/quote] ucs这个问题, 可能与我这几天恶补的资料有点冲突。这个问题先往后放一放。 ——————分割线—————————— 问个实战问题, pyton对不同编码encode带来的问题. 做个试验吧:
ordinal_unicode = u'\u00aa'
ordinal_latin = open('ordinal_latin.txt', 'w')
ordinal_latin.write(ordinal_unicode.encode('iso-8859-9'))
ordinal_latin.close()
运行后,用cat命令查看 ordinal_latin.txt, 看有没有乱码? 我的系统是没有乱码,我百思不得其解,linux终端默认是utf-8,那么cat命令查看后,必然乱码啊。 难道cat命令自身会偷偷的转编码不成? [/quote] 会乱码[/quote] unicode_str = u'\u8BA1' #print(unicode_str.encode('ascii')) print(unicode_str.encode('utf-8')) print(unicode_str) 均打印为中文字符,“计”。 linux 下测试。 让人费解,为什么都正确显示了? print不是默认用asicc编码了吗?
pcboyxhy 2015-12-14
  • 打赏
  • 举报
回复
Java里面也有同样的概念,C/C++语言本身没有这个概念。Unicode是一个表,映射了 数值 => 字符。unicode数值存储到文件或者跟其它程序交互的时候,需要序列化,于是有了UTF-8,UTF-16BE/LE,UTF-32等不同的序列化方式。Python和Java提供了标准的Unicode(UCS2/UCS4)处理机制,先转换成unicode再处理,可以只提供unicode的方法,不用为UTF-8/16/32分别提供一组方法。 这也不是强制的,你完全可以读取utf-8,然后直接处理utf-8再写入,没有转换的过程,只不过你得自己实现或者用支持utf-8的专用方法。
pcboyxhy 2015-12-14
  • 打赏
  • 举报
回复
引用 5 楼 u012879787 的回复:
[quote=引用 4 楼 pcboyxhy 的回复:] [quote=引用 3 楼 u012879787 的回复:] [quote=引用 2 楼 pcboyxhy 的回复:] Java里面也有同样的概念,C/C++语言本身没有这个概念。Unicode是一个表,映射了 数值 => 字符。unicode数值存储到文件或者跟其它程序交互的时候,需要序列化,于是有了UTF-8,UTF-16BE/LE,UTF-32等不同的序列化方式。Python和Java提供了标准的Unicode(UCS2/UCS4)处理机制,先转换成unicode再处理,可以只提供unicode的方法,不用为UTF-8/16/32分别提供一组方法。 这也不是强制的,你完全可以读取utf-8,然后直接处理utf-8再写入,没有转换的过程,只不过你得自己实现或者用支持utf-8的专用方法。
1. 谢谢 2. UTF-16BE/LE,UTF-32 ,为什么只有utf-16才分大端,小端, utf-32, utf-8不分? 3. 标准的Unicode(UCS2/UCS4)处理机制,我不知道你从什么地方得知这句话? 据我所知, unicode和iso是2套系统,iso搞了一个ucs, 后来合成一个,所以 utf-16兼容ucs-2, ucs-2表示的字符数很少, utf-16是有代理的概念,所以可以存储很多字符。 4. 再次看看新的问题,谢谢。[/quote] 只有UTF-8没有byte order,其它都有大小端之分。 python2编译的时候有个参数,让你决定用ucs2还是ucs4
python2.7-2.7.11$ ./configure --help | grep unicode
  --enable-unicode[=ucs[24]]
[/quote] ucs这个问题, 可能与我这几天恶补的资料有点冲突。这个问题先往后放一放。 ——————分割线—————————— 问个实战问题, pyton对不同编码encode带来的问题. 做个试验吧:
ordinal_unicode = u'\u00aa'
ordinal_latin = open('ordinal_latin.txt', 'w')
ordinal_latin.write(ordinal_unicode.encode('iso-8859-9'))
ordinal_latin.close()
运行后,用cat命令查看 ordinal_latin.txt, 看有没有乱码? 我的系统是没有乱码,我百思不得其解,linux终端默认是utf-8,那么cat命令查看后,必然乱码啊。 难道cat命令自身会偷偷的转编码不成? [/quote] 会乱码
苦逼码农 2015-12-14
  • 打赏
  • 举报
回复
引用 4 楼 pcboyxhy 的回复:
[quote=引用 3 楼 u012879787 的回复:] [quote=引用 2 楼 pcboyxhy 的回复:] Java里面也有同样的概念,C/C++语言本身没有这个概念。Unicode是一个表,映射了 数值 => 字符。unicode数值存储到文件或者跟其它程序交互的时候,需要序列化,于是有了UTF-8,UTF-16BE/LE,UTF-32等不同的序列化方式。Python和Java提供了标准的Unicode(UCS2/UCS4)处理机制,先转换成unicode再处理,可以只提供unicode的方法,不用为UTF-8/16/32分别提供一组方法。 这也不是强制的,你完全可以读取utf-8,然后直接处理utf-8再写入,没有转换的过程,只不过你得自己实现或者用支持utf-8的专用方法。
1. 谢谢 2. UTF-16BE/LE,UTF-32 ,为什么只有utf-16才分大端,小端, utf-32, utf-8不分? 3. 标准的Unicode(UCS2/UCS4)处理机制,我不知道你从什么地方得知这句话? 据我所知, unicode和iso是2套系统,iso搞了一个ucs, 后来合成一个,所以 utf-16兼容ucs-2, ucs-2表示的字符数很少, utf-16是有代理的概念,所以可以存储很多字符。 4. 再次看看新的问题,谢谢。[/quote] 只有UTF-8没有byte order,其它都有大小端之分。 python2编译的时候有个参数,让你决定用ucs2还是ucs4
python2.7-2.7.11$ ./configure --help | grep unicode
  --enable-unicode[=ucs[24]]
[/quote] ucs这个问题, 可能与我这几天恶补的资料有点冲突。这个问题先往后放一放。 ——————分割线—————————— 问个实战问题, pyton对不同编码encode带来的问题. 做个试验吧:
ordinal_unicode = u'\u00aa'
ordinal_latin = open('ordinal_latin.txt', 'w')
ordinal_latin.write(ordinal_unicode.encode('iso-8859-9'))
ordinal_latin.close()
运行后,用cat命令查看 ordinal_latin.txt, 看有没有乱码? 我的系统是没有乱码,我百思不得其解,linux终端默认是utf-8,那么cat命令查看后,必然乱码啊。 难道cat命令自身会偷偷的转编码不成?
pcboyxhy 2015-12-14
  • 打赏
  • 举报
回复
引用 3 楼 u012879787 的回复:
[quote=引用 2 楼 pcboyxhy 的回复:] Java里面也有同样的概念,C/C++语言本身没有这个概念。Unicode是一个表,映射了 数值 => 字符。unicode数值存储到文件或者跟其它程序交互的时候,需要序列化,于是有了UTF-8,UTF-16BE/LE,UTF-32等不同的序列化方式。Python和Java提供了标准的Unicode(UCS2/UCS4)处理机制,先转换成unicode再处理,可以只提供unicode的方法,不用为UTF-8/16/32分别提供一组方法。 这也不是强制的,你完全可以读取utf-8,然后直接处理utf-8再写入,没有转换的过程,只不过你得自己实现或者用支持utf-8的专用方法。
1. 谢谢 2. UTF-16BE/LE,UTF-32 ,为什么只有utf-16才分大端,小端, utf-32, utf-8不分? 3. 标准的Unicode(UCS2/UCS4)处理机制,我不知道你从什么地方得知这句话? 据我所知, unicode和iso是2套系统,iso搞了一个ucs, 后来合成一个,所以 utf-16兼容ucs-2, ucs-2表示的字符数很少, utf-16是有代理的概念,所以可以存储很多字符。 4. 再次看看新的问题,谢谢。[/quote] 只有UTF-8没有byte order,其它都有大小端之分。 python2编译的时候有个参数,让你决定用ucs2还是ucs4
python2.7-2.7.11$ ./configure --help | grep unicode
  --enable-unicode[=ucs[24]]
苦逼码农 2015-12-14
  • 打赏
  • 举报
回复
引用 2 楼 pcboyxhy 的回复:
Java里面也有同样的概念,C/C++语言本身没有这个概念。Unicode是一个表,映射了 数值 => 字符。unicode数值存储到文件或者跟其它程序交互的时候,需要序列化,于是有了UTF-8,UTF-16BE/LE,UTF-32等不同的序列化方式。Python和Java提供了标准的Unicode(UCS2/UCS4)处理机制,先转换成unicode再处理,可以只提供unicode的方法,不用为UTF-8/16/32分别提供一组方法。 这也不是强制的,你完全可以读取utf-8,然后直接处理utf-8再写入,没有转换的过程,只不过你得自己实现或者用支持utf-8的专用方法。
1. 谢谢 2. UTF-16BE/LE,UTF-32 ,为什么只有utf-16才分大端,小端, utf-32, utf-8不分? 3. 标准的Unicode(UCS2/UCS4)处理机制,我不知道你从什么地方得知这句话? 据我所知, unicode和iso是2套系统,iso搞了一个ucs, 后来合成一个,所以 utf-16兼容ucs-2, ucs-2表示的字符数很少, utf-16是有代理的概念,所以可以存储很多字符。 4. 再次看看新的问题,谢谢。
苦逼码农 2015-12-13
  • 打赏
  • 举报
回复

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧