win、py、notepad++的编码方式及问题

win、py、notepad++的编码方式及问题先说结论:因为win的cmd默认使用的编码方式是gbk(ANSI) 所以遇到bat或者python中的中文需要在cmd中print显示时,如果出现乱码,首先需要检查是否因为不是 1. gbk编码的中文或2. 在代码中被转换为gbk编码或3. 在python代码中是unicode对象。别在win下用自带的文本文档编辑器打开utf-8编码的文件并保存
摘要由CSDN通过智能技术生成

win、py、notepad++的编码方式及问题

先说结论:

  • 因为win的cmd默认使用的编码方式是gbk(ANSI) 所以遇到bat或者python中的中文需要在cmd中print显示时,如果出现乱码,首先需要检查是否因为不是 1. gbk编码的中文或2. 在代码中被转换为gbk编码或3. 在python代码中是unicode对象

  • 别在win下用自带的文本文档编辑器打开utf-8编码的文件并保存,因为win默认会在utf-8编码的内容中加BOM,只是查看还没问题因为不保存不会自动加BOM,但是如果保存的话就win就会自动的加BOM

  • 注意notepad++的设置,即 设置->首选项->新建新建文档的默认编码方式推荐还是按照win默认的ANSI保存,否则创建的utf-8文档若被自带的文档编辑器打开,就会自动加BOM,导致一些未可知的运行错误

  • 对于在win下用notepad++写.py 虽然不会有被打开编辑导致加BOM的问题,但是因为有时会需要在cmd中显示,所以最好还是不要用utf-8编码,用ANSI即gbk编码吧

  • python代码前面添加的 #!coding=utf-8或者 #!coding=gbk等表示编码方式的含义是给python的解释器看的,结论就是最好与文档本身的编码方式相吻合,对于win下面的python代码,也就是最好是#!coding=gbk

ok,说完了上面的结论,开始说一下具体的细节。

写这个文档的原因是因为在notepad++写python代码时遇到的一个问题:

1 前情提要:

  • 在notepad++中安装了python Script插件使得可以使用notepad++作为一个IDE编辑器。
  • 因为之前写的一些python代码涉及到中文路径,以及一些中文注释,所以在notepad++中直接用了#!coding=utf-8 ,但是.py文件本身的编码方式还是默认的gbk。
  • 之前在notepad++的设置中设置了使用utf-8应用于打开ANSI文件,这是个很奇怪的功能,就是说文件本身编码的方式还是gbk,但是notepad++打开后先转码成了utf-8并显示,然后在保存的时候还是按原来的方式,即gbk的编码保存,引起了后面分析一系列的误解,之后再详细说明。

2 问题出现的情形:

  • 本身这种“编码关系错乱”的python代码直接在notepad++中编辑并使用Python Script运行或直接使用python的解释器运行时是没问题的,也就是说—-中文路径可以识别,且能够正确读出路径中的文件等
  • 将这种代码使用pycharm打开,在IDE中显示代码中的中文就变成了乱码,同时,也无法运行了。

3 问题的分析:

3.1 字符的编码方式

* ASCII码*

八个二进制位(bit)可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。

ASCII码一共规定了128个字符的编码,比如空格”SPACE”是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。

非ASCII编码

英语用128个符号编码就够了,但是用来表示其他语言,128个符号是不够的。比如,在法语中,字母上方有注音符号,它就无法用ASCII码表示。于是,一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号。比如,法语中的é的编码为130(二进制10000010)。这样一来,这些欧洲国家使用的编码体系,可以表示最多256个符号。 但是,这里又出现了新的问题。不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。比如,130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel (ג),在俄语编码中又会代表另一个符号。但是不管怎样,所有这些编码方式中,0–127表示的符号是一样的,不一样的只是128–255的这一段。

至于亚洲国家的文字,使用的符号就更多了,汉字就多达10万左右。一个字节只能表示256种符号,肯定是不够的,就必须使用多个字节表达一个符号。比如,简体中文常见的编码方式是GB2312,使用两个字节表示一个汉字,所以理论上最多可以表示256x256=65536个符号。 中文编码的问题需要专文讨论,这篇笔记不涉及。这里只指出,虽然都是用多个字节表示一个符号,但是GB类的汉字编码与后文的Unicode和UTF-8是毫无关系的

Unicode

正如上一节所说,世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。为什么电子邮件常常出现乱码?就是因为发信人和收信人使用的编码方式不一样。

可以想象,如果有一种编码&#x

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值