字符编码

python3和python2编码拾遗

依然范特西╮ 提交于 2019-12-09 22:26:49
py2编码 tr和unicode str和unicode都是basestring的子类。严格意义上说,str其实是字节串,它是unicode经过编码后的字节组成的序列。对UTF-8编码的str'苑'使用len()函数时,结果是3,因为utf8编码的'苑' == '\xe8\x8b\x91'。 而unicode是一个字符串,str是unicode这个字符串经过编码(utf8,gbk等)后的字节组成的序列。如上面utf8编码的字符串'汉'。 unicode才是真正意义上的字符串,对字节串str使用正确的字符编码进行解码后获得,并且len(u'苑') == 1。 在Py2里,str=bytes。 py2编码的最大特点是Python 2 将会自动的将bytes数据解码成 unicode 字符串 所以在2里我们可以将字节与字符串拼接。 两个问题: 1 print '苑昊' :本来存的是'\xe8\x8b\x91\xe6\x98\x8a',为什么显示了 苑昊 的明文? 2 字节串和字符串可以拼接? 这就是那些可恶的 UnicodeError 。你的代码中包含了 unicode 和 byte 字符串,只要数据全部是 ASCII 的话,所有的转换都是正确的,一旦一个非 ASCII 字符偷偷进入你的程序,那么默认的解码将会失效,从而造成 UnicodeDecodeError 的错误。 Python

字符编码与解码

大城市里の小女人 提交于 2019-12-09 21:50:08
最近遇到一个关于字符编码与解码的问题,使用GB2312保存了一个文件,然后使用vscode打开的时候,发现中文字符全是乱码了。为什么会出现这个问题?研究了一下编码与解码。 文件在计算机上存储的都是二进制。顾名思义,编码就是把一个字符编码成二进制码存起来的方式,而解码就是把这个二进制码按照原本编码的规则还原成原来的字符。 我们经常使用的ASCII码,是上个世纪60年代美国制定的一套字符编码,它规定了英语字符与二进制位之间的关系,一直沿用至今。ASCII 码一共规定了128个字符的编码。ASCII使用一个字节来进行编码,一个字节有8个bit位,ASCII只使用了后面的7个bit位,最前面的一个bit位使用0填充。 一些欧洲国家发现ASCII编码的128个字符不能表示他们的语言的所有的字符,所以他们决定启用最前面的一位,这样一来,就可以编码256个字符了,比以前又多了128个字符可以使用。 但是又有问题出现了,不同的国家的字母不一样,他们启用最高位来进行编码,不同的语言有不同的编码方式,导致了同样的编码在不同的国家代表的字符不一样;例如法语中130代表é,但是在希腊语中代表的是ג。注意由于各个国家都是在美国制定的标准上来扩充ASCII的,他们都保留了美国人制定的标准,也就是说所有的字符编码中,0-127表示的符号是一样的,128-256表示的符号在各个国家制定的编码表中是不一样的

二维码实现原理

霸气de小男生 提交于 2019-12-09 21:05:51
二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型:比如:字符,数字,日文,中文等等。这两天学习了一下二维码图片生成的相关细节,觉得这个玩意就是一个密码算法,在此写一这篇文章 ,揭露一下。供好学的人一同学习之。 关于QR Code Specification,可参看这个PDF: http://raidenii.net/files/datasheets/misc/qr_code.pdf 基础知识 首先,我们先说一下二维码一共有40个尺寸。官方叫版本Version。Version 1是21 x 21的矩阵,Version 2是 25 x 25的矩阵,Version 3是29的尺寸,每增加一个version,就会增加4的尺寸,公式是:(V-1)*4 + 21(V是版本号) 最高Version 40,(40-1)*4+21 = 177,所以最高是177 x 177 的正方形。 下面我们看看一个二维码的样例: 定位图案 Position Detection Pattern是定位图案,用于标记二维码的矩形大小。这三个定位图案有白边叫Separators for Postion Detection Patterns。之所以三个而不是四个意思就是三个就可以标识一个矩形了

python2与python3编码(练习)

时光怂恿深爱的人放手 提交于 2019-12-09 18:41:49
#_author:来童星#date:2019/12/9import jsons='star'a=s.encode('utf8')print(s,type(s))# star <class 'str'>print(a.decode('utf8'))# stars1='星星' # unicode类型,一个汉字对应三个字节a1=s1.encode('utf8')#按照utf编码print(a1,type(a1))# b'\xe6\x98\x9f\xe6\x98\x9f' <class 'bytes'>print(a1.decode('utf8'))# 星星print(a1.decode('gbk'))# 鏄熸槦b1=s1.encode('gbk')print(b1,type(b1)) # b'\xd0\xc7\xd0\xc7' <class 'bytes'>print(b1.decode('gbk'))# 星星#查看字符串对应的unicodeprint(json.dumps(s1)) # "\u661f\u661f"# 方法二:t='星星'b=bytes(t,'utf8')print(b)# b'\xe6\x98\x9f\xe6\x98\x9f's=str(b,'utf8')print(s)# 星星 来源: https://www.cnblogs.com/startl/p

Unicode、UTF-8、UTF-16之间的关系

放肆的年华 提交于 2019-12-09 18:08:45
1、为什么需要Unicode 在很早以前所有,在计算机的世界里只有ASCII,后来多了一些控制字符、标点等,最后就是今天的世界里你能够看到很多种语言在一个文档中,例如:English, العربية, 汉语, עִבְרִית, ελληνικά, and ភាសាខ្មែរ ,后期或许会出现更多的其他语言的字符,计算机中需要显示所有的这些语言的字符。因此:一个包容所有语言字符的 字符集 很有必要,这就是Unicode的诞生的意义。 2、Unicode简介 Unicode是一个包含世界上所有语言字符的 字符集 ,它为世界上每一个字符分配一个唯一的数字,官方术语叫 code point(码位)。Unicode的一个很大的优点是,码位的前256位和ISO-8859-1以及ASCII一样。大部分常用的字符通过一到两个字节就可以表示。 3、为什么需要UTF-8或者UTF-16等编码 虽然Unicode能够包容所有的字符集,但是我们直接看Unicode码很不方便,像看天书一样,我们对我们常用的文字最熟悉,所以就需要把我们常用的可读性强的文字和Unicode字符集一一对应。这个过程叫编码。 常用的UTF-8、GBK、UTF-16等都是不同的编码方式,这些都是把我们看到的文字和Unicode字符集对应起来的规则。 4、UTF-8和UTF-16之间的区别 1、基于内存考虑的比较: UTF-8:

C++中文显示问题(转自 csdn dbzhang800)

帅比萌擦擦* 提交于 2019-12-09 15:49:19
原文网址 http://blog.csdn.net/dbzhang800/article/details/7540905 长期以来,很多人都清楚,一旦C++源码中直接使用了中文,这样的源码想要跨平台(I18N)会非常困难。 随着: Windows下:MSVC2010成为主流 Linux下:GCC升级到4.6 C++中的中文问题 才算有了一个比较优雅的、跨平台的Workaround。 (本文讨论编译器范围:GCC4.6+, MSVC2010sp1+ 。本文属于QString系列,但暂不涉及QString) C++ 中文问题 要在C++中正确使用中文,必须要了解下面两个概念: 源码字符集(the source character set) 源码文件是使用何种编码保存的 执行字符集(the execution character set) 可执行程序内保存的是何种编码(程序执行时内存中字符串编码) C++98的问题: 既没有规定源码字符集,也没有规定执行字符集 这个... 如何理解?不妨看个例子 例子 这个要求高么? 一个简单的C++程序,只是希望它能在简体中文Windows、正体中文Windows、英文版Windows、Linux、MAC OS...下的结果一致。 //main.cppint main(){ char mystr[] = "老老实实的学问,来不得半点马虎";

字符集问题

别说谁变了你拦得住时间么 提交于 2019-12-09 15:47:30
本文介绍了编码字符集的概念以及Java与编码字符集之间的关系,文章的内容来自于本人工作过程中的经验积累以及网络中的相关文章介绍,如果文章中有任何纰漏欢迎读者指正,让我们共同讨论学习J 1. 字符 字符是抽象的最小文本单位。它没有固定的形状(可能是一个字形),而且没有值。“A”是一个字符,“€”(德国、法国和许多其他欧洲国家通用货币的标志)也是一个字符。“中”“国”这是两个汉字字符。字符仅仅代表一个符号,没有任何实际值的意义。 2. 字符集 字符集是字符的集合。例如,汉字字符是中国人最先发明的字符,在中文、日文、韩文和越南文的书写中使用。这也说明了字符和字符集之间的关系,字符组成字符集。 3. 编码字符集 编码字符集是一个字符集(有时候也被简称位字符集),它为每一个字符分配一个唯一数字。最早的编码是iso8859-1,和ascii编码相似。但为了方便表示各种各样的语言,逐渐出现了很多标准编码。 iso8859-1:属于单字节编码字符集,最多能表示的字符范围是0-255,应用于英文系列,除了iso8859-1以外还有其他iso8859系列的编码,这些编码都是为了满足欧洲国家语言字符的需要而设计的。 GB2312/GBK/ GB18030:前面提到的iso8859-1最多只能表示256个字符,这对于汉字来说实在是有些抱歉,所以就有了现在要介绍的汉字国标码,专门用来表示汉字

JavaSE-IO操作

我们两清 提交于 2019-12-09 12:48:05
目录 目录 第一章:IO介绍 1.1 什么是IO 1.2 IO的分类 1.3 IO顶级的父类 第二章:字节流 2.1 一切皆为字节流 2.2 字节输出流-OutputStream 2.3 FileOutputStream类 2.4 字节输入流 2.5 FileInputStream类 2.6 复制图片文件 第三章:字符流 3.1 为什么要学习字符流 3.2 字符输入流-Reader 3.3 FileReader类 3.4 字符输出流-Writer 3.5 FileWriter类 第四章:IO异常处理 4.1 JDK7之前的处理方式 4.2 JDK7中的新特性 4.3 JDK9中的新特性 第五章:属性集 5.1 属性集合介绍 5.2 Properties 类 第六章:缓冲流 6.1 缓冲流介绍 6.2 字节缓冲流 6.3 字符缓冲流 6.4 文本排序 第七章:转换流 7.1 字符编码和字符集 7.2 编码引出的问题 7.3 InputStreamReader类 7.4 OutputStreamWriter 类 7.5 图解转换流原理 第八章:序列化 8.1 对象序列化介绍 8.2 ObjectOutputStream类 8.3 ObjectInputStream类 第九章:打印流 9.1 打印流介绍 9.2 PrintStream类 目录 第一章:IO介绍 1.1 什么是IO ​

UTF8 与 UTF8 +BOM 区别

房东的猫 提交于 2019-12-09 11:01:12
一个带标签,一个没有标签。 BOM是Byte Order Mark(定义字节顺序),因为在网络传输中分两种顺序:大头和小头。 由于兼容性,带BOM的utf-8在一些browser中显示为乱码。 网上搜索了关于Byte Order Mark的信息: 在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建 议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这 个字节流是Little- Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。 UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF 开头的字节流,就知道这是UTF-8编码了。 Windows就是使用BOM来标记文本文件的编码方式的。 带BOM的UTF-8,所有PHP无法识别,直接将EF BB BF输出,在charset="utf-8"的页面中是空白

编码字符集

送分小仙女□ 提交于 2019-12-09 10:58:33
本文介绍了编码字符集的概念以及Java与编码字符集之间的关系,文章的内容来自于本人工作过程中的经验积累以及网络中的相关文章介绍,如果文章中有任何纰漏欢迎读者指正,让我们共同讨论学习J 1. 字符 字符是抽象的最小文本单位。它没有固定的形状(可能是一个字形),而且没有值。“A”是一个字符,“€”(德国、法国和许多其他欧洲国家通用货币的标志)也是一个字符。“中”“国”这是两个汉字字符。字符仅仅代表一个符号,没有任何实际值的意义。 2. 字符集 字符集是字符的集合。例如,汉字字符是中国人最先发明的字符,在中文、日文、韩文和越南文的书写中使用。这也说明了字符和字符集之间的关系,字符组成字符集。 3. 编码字符集 编码字符集是一个字符集(有时候也被简称位字符集),它为每一个字符分配一个唯一数字。最早的编码是iso8859-1,和ascii编码相似。但为了方便表示各种各样的语言,逐渐出现了很多标准编码。 iso8859-1:属于单字节编码字符集,最多能表示的字符范围是0-255,应用于英文系列,除了iso8859-1以外还有其他iso8859系列的编码,这些编码都是为了满足欧洲国家语言字符的需要而设计的。 GB2312/GBK/ GB18030:前面提到的iso8859-1最多只能表示256个字符,这对于汉字来说实在是有些抱歉,所以就有了现在要介绍的汉字国标码,专门用来表示汉字