首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

unicode和utf8 —— 从一个

这里可能有个疑问就是,按之前的理解(假设已经读了第1篇)unicode是编码规则,但不是存储方式,uft8才是它的实现,才能用来存储,那么如果python内部是用unicode方式处理文本,在内存中python...text string 都应该是 unicode 类型,而不是 str,如果你在操作 text,而类型却是 str,那就是在制造 bug。...所以还是跟操作系统有关 # 这里默认在linux系统下执行,所以直接用utf8解了,如果要兼容,可以用chardet获取编码类型后指定进行解码 PATH = PATH.decode('utf8...w'打开去写,而不需要'wb' # 不过不编码成utf8的话也是会抛UnicodeDecodeError的,写文件需要编码这个原则py2还是有的。...f.write(("%s\n" % each).encode('utf8')) else: # Python3, 可以用w打开然后不编码直接写string(即unicode),也是可以成功写的

83010
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    python 之字符编码

    比utf-8更高效啊(uicode固定用2个字节编码,utf-8则需要计算),但是unicode更浪费空间,没错,这就是用空间换时间的一种做法,而存放到硬盘,或者网络传输,都需要把unicode转成utf...-8,因为数据的传输,追求的是稳定,高效,数据量越小数据传输就越靠谱,于是都转成utf-8格式的,而不是unicode。...存文件时用utf-8编码,保证兼容万国,不会乱码,而读文件时选择了错误的解码方式,比如gbk,则在读阶段发生乱码,读阶段发生乱码是可以解决的,选对正确的解码方式就ok了,而存文件时乱码,则是一种数据的损坏...这种情况下,要进行编码转换,都需要先用 decode方法将其转换成unicode编码,再使用encode方法将其转换成其他编码。...")时,字符串为unicode数据 python 2 乱码 解释器按utf8解码,翻译为bytes在执行,cmd应该把"坏小子"打印为bytes数据,而不是明文

    82620

    Unicode,GBK和UTF-8

    u'你好'.encode('utf8').decode('gbk') 浣犲ソ 如上面的代码所示, “你好"两个汉字字符的unicode分别为4f60和597d, utf-8编码后占6个字节, 而gbk...如果用utf8编码后错误地用gbk来解码, 就会得到3个unicode码点,分别表示字符浣,犲和ソ;而如果用gbk编码后 错误地用utf8来解码, 则在解码第二个字符时无法凑够3个字节, 因此会得到未知的结果...的utf8编码 的叠加, 因此如果平时遇到多个utf8编码的Unicode占位符且不巧用了gbk的方式解码,那就会看到熟悉的锟斤铐了....其他 在Windows的Notepad.exe中, 保存文件的格式可以看到有如下几种: notepad 可刚刚不是说Unicode只是字符集吗, 为什么上面显示可以保存为Unicode"编码”?..., 我想你应该知道该怎么回答了吧: Unicode是 一种字符集, 而GBK和UTF-8都是编码, 因此Unicode和后两者不是一类事物, 是无法进行对比的.

    1.5K20

    mysql插入数据会失败?为什么?

    编码和字符集的关系 虽然我们平时可以在编辑器上输入各种中文英文字母,但这些都是给人读的,不是给计算机读的,其实计算机真正保存和传输数据都是以二进制0101的格式进行的。...为了统一它们,于是出现了Unicode编码格式,它用了2~4个字节来表示字符,这样理论上所有符号都能被收录进去,并且它还完全兼容ASCII的编码,也就是说,同样是字母d,在ASCII用64表示,在Unicode...但不同的地方是ASCII编码用1个字节来表示,而Unicode用则两个字节来表示。 比如下图,同样都是字母d,unicode比ascii多使用了一个字节。...而从上面mysql支持的字符集的图里,我们看到了utf8和utf8mb4。...为了统一这些各种编码格式,大佬们又引入了unicode编码格式,而utf-8则在unicode的基础上做了优化,压缩了空间。

    1.3K20

    字符编码实战

    这里就有两个严重的问题: 第一个问题是,如何才能区别 Unicode 和 ASCII ?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?...它可以用一至四个字节对Unicode字符集中的所有有效编码点进行编码,属于Unicode标准的一部。...因为 unicode只是一种编码,他甚至不是一种存储形式。而 python2 似乎把这一切都搞错了。...go 中的 string 可以直接转换为 []byte,但是对于 utf8 串,我们在处理的时候往往更关注的是 "character" 即一个一个的字符,而不是 byte。...一个做法就是实用 python2 的类似处理,用 unicode 编码的字符表示来存储,即 直接存储为 '\ud83d\ude01' 【这里为什么不是 U+1F601 呢,这两个其实是同一个 16进制数字

    1.8K70

    java基础类型中的char和byte的辨析及Unicode编码和UTF-8的区别

    这里就有两个严重的问题,第一个问题是,如何才能区别Unicode和ASCII?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?...以utf8为例,utf8是一个变长编码标准,可以以1~4个字节表示一个字符,而中文占3个字节,ascII字符占1个字节。 为什么我们在java里面可以用一个char来表示一个中文呢?...在编译时会把utf8的中文字符转换成对应的unicode来进行传输运算。...unicode是一个定长的编码标准,每个字符都是2个字节,也就是1个char类型的空间。 Java在编译时会把utf8的中文字符转换成对应的unicode来进行传输运算。...UTF-8采用的是变长字节编码的方式进行编码,一个汉字可以以1~4个字节表示一个字符,而中文占3个字节,ascII字符占1个字节。

    87220

    decode和encode函数_python lstrip

    如:s=‘中文’ 如果是在utf8的文件中,该字符串就是utf8编码,如果是在gb2312的文件中,则其编码为gb2312。...这种情况下,要进行编码转换,都需要先用decode方法将其转换成unicode编码,再使用encode方法将其转换成其他编码。通常,在没有指定特定的编码方式时,都是使用的系统默认编码创建的代码文件。...如果一个字符串已经是unicode了,再进行解码则将出错,因此通常要对其编码方式是否为unicode进行判断: isinstance(s, unicode) #用来判断是否为unicode 用非unicode...,而不是程序本身的问题。...这是因为UliPad在英文WindowsXP上的控制台信息输出窗口是按照ascii编码输出的(英文系统的默认编码是ascii),而上面代码中的字符串是Unicode编码的,所以输出时产生了错误。

    54210

    Eclipse保存文件时出现字符编码错误

    eclipse 由于开源所以支持了比较杂的编码方式,而这些一个工程导入时添加了不少的外来程序,由于不是同一工程一次编码带来了其中含有 GBK 或 UTF8 或 UTF16 或 ASCII 等文件编译时就会出现错误警告...GBK 包含全部中文字符,是国家编码,通用性比 UTF8 差,不过 UTF-8 占用的数据库比 GBK 大。 Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。...Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。...Unicode的最初目标,是用1个16位的编码来为超过65000个字符提供映射。但这还不够,它不能覆盖全部历史上的文字,也不能解决传输的问题,尤其在那些基于网络的应用中。...因此,Unicode用一些基本的保留字符制定了三套编码方式。它们分别是UTF-8、UTF-16和UTF-32。 正如名字所示,在UTF-8中,字符是以8位序列来编码的,用一个或几个字节来表示一个字符。

    3.4K10

    MySQL 的字符集与排序规则

    而如果用不同的0和1组合表示不同的字符就是编码。 那什么叫字符编码呢?...字符最终是以二进制形式存储在磁盘的,这也是为什么要有字符编码的原因,因为计算机最终都要以二进制形式存储,那么编码规则就是用什么样的二进制来代表这个字符。...准确概述来说,字符编码方式是用一个或多个字节的二进制形式表示字符集中的一个字符。每种字符集都有自己特有的编码方式,因此同一个字符,在不同字符集的编码方式下,可能会产生不同的二进制形式。...它仅能够在字符之间进行逐个比较。这意味着 utf8_general_ci 校对规则进行的比较速度很快,但是与使用 utf8_unicode_ci 的校对规则相比,比较正确性较差)。...utf8_general_ci 也适用于德语和法语,除了‘ß’等于‘s’,而不是‘ss’之外。如果你的应用能够接受这些,那么应该使用 utf8_general_ci,因为它速度快。

    2.4K20

    本文带你深入理解 String Unicode UTF8 UTF16

    (有实际含义的编码并没这么多)目前的 Unicode 字符分为17组编排,每组称为平面(Plane),而每平面拥有65536(即2^4^4=2^16)个代码点。目前只用了少数平面。...那样的话,字母z就是00000000 00000000 01111010了,而之前用ASCII的时候,我们用01111010就可以表示字母z。...使用「可变长编码」,每个字符不一定都要用统一的长度来表示,针对常见的字符,我们用8个二进制位,不常见的字符,我们用16个二进制位,更不常见的字符,我们用24个二进制位。...这也是哈夫曼编码的思想。要设计一套高效的「可变长编码」,你必须满足一个条件:它是「前缀码」。即通过前缀,我就能知道这个字符要占用多少字节。而UTF8,就是一种「可变长编码」。...UTF16不是前缀码? 遇到110110xx xxxxxxxx 110111xx xxxxxxxx,怎么判断它是1个大的Unicode字符、还是2个连续的小的Unicode字符呢?

    5.8K141

    python中的编码与解码

    编码与解码 首先,明确一点,计算机中存储的信息都是二进制的 编码/解码本质上是一种映射(对应关系),比如‘a’用ascii编码则是65,计算机中存储的就是00110101,但是显示的时候不能显示00110101...而str.decode是将字节流str按给定的解码方式解码,并转换成utf-8形式,u.encode是将unicode类按给定的编码方式转换成字节流str 注意调用encode方法的是unicode对象生成的是字节流...'> 严 u = s.encode('utf8') u print type(u),u 倘若这时我用s.encode('utf8'),则将s使用utf-8编码并将编码结果保存为字节流 第二行输出'\xe4...当调用print函数将内容格式化输出到终端时,会将unicode对象转换为终端的编码方式输出,如上面第一次print的结果是正常的,print utf8字节流时,终端按其默认gbk解码显示时就会出问题,...gbk的而不是unicode 参考 字符编码简介 http://blog.csdn.net/trochiluses/article/details/8782019 chcp http://baike.baidu.com

    1.3K10

    python中的import,reloa

    e.g: import os reload(os) 说明: reload会重新加载已加载的模块,但原来已经使用的实例还是会使用旧的模块,而新生产的实例会使用新的模块;reload后还是用原来的内存地址...因为这里的import语句其实并不是sys的第一次导入语句,也就是说这里其实可能是第二、三次进行sys 模块的import,这里只是一个对sys的引用,只能reload才能进行重新加载;那么为什么要重新加载...utf8的了,多次重启之后,效果相同,这是因为系统在python启动的时候,自行调用该文件,设置系统的默认编码,而不需要每次都手动的加上解决代码,属于一劳永逸的解决方法。...现在,字节字符串s就被当成一个UTF-8字节列表去创建一个Unicode字符串u, 下一行用UTF-8表示的字符 串u转换成字节字符串backToBytes....pass 单独判断是不是Unicode字符串: if isinstance( s, unicode ):     pass 读取UTF-8编码的文件 你可以手工转换从文件中读取的字符串,方法很简单: import

    75410

    Mysql存储微信Emoji表情问题

    问题根本原因 Mysql 版本是 5.7.22,当时使用下面命令创建数据库,使用 utf8 编码。但 utf8 不支持 Emoji 表情。...不支持emoji,是因为emoji是用4个字节存储的字符,而mysql的utf8只能存储1-3个字节的字符。...utf8_unicode_ci 准确度高,但校对速度稍慢。 小结:如果你的应用有德语、法语或者俄语,请一定使用 utf8_unicode_ci。一般用 utf8_general_ci 就足够。...但抛开数据库,标准的 UTF-8 字符集编码是可以用 1~4 个字节去编码21位字符,这几乎包含了是世界上所有能看见的语言了。...然而在MySQL里实现的utf8最长使用3个字节,也就是只支持到了 Unicode 中的 基本多文本平面 (U+0000至U+FFFF),包含了控制符、拉丁文,中、日、韩等绝大多数国际字符,但并不是所有

    2K10

    转载:从程序员的角度看ASCII, GB2312, UNICODE, UTF-8

    注意这个变换规则不是通过查表实现的,而只要用一些位移操作就可以实现. 这就是UTF8. 总结: UTF8 只是 UNICODE内码在存储/传输时的状态....而从GB2312编码转换到UNICODE编码需要查表. UTF8 和 UNICODE 的关系 与 GB2312 和 UNICODE的关系有本质的不同....所以,要实现UTF8编码到GB2312编码的转换必须先把 UTF8编码还原为UNICODE编码,再通过查表的方式,把UNICODE编码转化为GB2312编码....由于目前所有的UNICODE字符只有65534个码位(BMP),所以用2个字节是没问题的. 2. Linux系统(比如Ubuntu)现在一般都用UTF8编码了....最后说明一点,对于不是专门处理字符编码的程序来说,所有字符编码相关的问题只是显示的问题,并不会影响到程序的内在逻辑. 开始用 Unicode 来编写我们的代码吧.

    1K30

    关于字符编码的那些事

    UTF-16编码最明显的优点是它在空间效率上比UTF-32高两倍,因为每个字符只需要2个字节来存储(除去65535范围以外的),而不是UTF-32中的4个字节。...关于BOM 因为UTF-32和UTF-16使用4字节或字节进行编码,因此传输的时候便会出现字节序的问题,例如“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。...utf8的编码中也有bom,EF BB BF,不过由于utf8没有字节序的问题,所以这个可以用了确认这个文件是用utf8编码的 优点 UTF-8是ASCII的一个超集。...然后我们用UltraEdit打开后查看其16进制的内容 ? 最前面的EF BB BF 表示这个文件是用utf8编码的 因为UTF-8是ASCII的一个超集。...A6通过上面的介绍我们可以知道其对应着百度两个字 utf8编码对应的十六进制 utf8编码对应的二进制 在Unicode字库序号的二进制 在Unicode字库序号的十六进制 百 e799 be 11100111

    1K60

    Go字符串 【Go语言圣经笔记】

    内置的len函数可以返回一个字符串总的byte数(而不是rune字符个数)(笔者注:如果想要取字符个数,需使用len([]rune(str)),这里面的差别在于byte对应uint8,而rune对应int32...而且即使是常用的字符也远少于65,536个,也就是说用16bit编码方式就能表达常用字符。但是,还有其它更好的编码方法吗? UTF-8 UTF8是一个将Unicode码点编码为字节序列的变长编码。...因此,\xe4\xb8\x96并不是一个合法的rune字符,虽然这三个字节对应一个有效的UTF8编码的码点。 得益于UTF8编码优良的设计,诸多字符串操作都不需要解码操作。...但是对应很多其它编码则并不是这样的。(上面的函数都来自strings字符串处理包,真实的代码包含了一个用哈希技术优化的Contains 实现。)...如果是将一个[]rune类型的Unicode字符slice或数组转为string,则对它们进行UTF8编码: fmt.Println(string(r)) // プログラム 将一个整数转型为字符串意思是生成以只包含对应

    41120

    帮你彻底弄懂常见的中文字符编码

    图中我们可以看出,ASCII被所有编码兼容,而最常见的UTF8与GBK之间除了ASCII部分之外没有交集,这也是平时业务中最常见的导致乱码场景,使用UTF8去读取GBK编码的文字,可能会看到各种乱码。...对于中文汉字来说,所有常用汉字的Unicode值都可以用3字节的UTF8表示出来,而GBK编码的汉字基本是2字节(GB18030虽4字节但是日常没人会写那些字)。...因为项目中用不到,我们对这种编码的细节没兴趣了解,唯一感兴趣的是为什么Mysql选它做默认编码(为什么默认编码不是UTF8)?...以及如果忘了设置Mysql表的编码方式时,用Latin1存储中文会不会出问题? ? [ Latin1编码表 ] 为什么默认编码是Latin1而不是UTF8?...例如你把UTF8编码的“讯”字(UTF8编码为0xE8AEAF,占三个字节)存入了Latin1编码的Mysql表,那么在Mysql眼里,你存入的并不是一个“讯”字,而是三个Latin1的字母(0xE8,

    3.4K30
    领券