linux python运行报编码错误

linux python运行报编码错误,第1张

一次重启服务器后,supervisor接管的python脚本中的函数 open() 和 print() 都会报下面的编码错误:

UnicodeEncodeError: 'ascii' codec can't encode

使用的是python3,按理说编码都会默认utf-8,而且本地运行的python脚本并没有这个问题。

经大佬指点,增加环境变量 export LC_ALL="en_US.UTF-8" 后,再重启supervisor,问题解决

下面是复制的: https://www.cnblogs.com/badboy200800/p/11215981.html

Locale是一个软件在运行时的语言环境,。是根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统所定义的。它包括语言(Language), 地域 (Territory) 和字符集(Codeset)。

一个locale的书写格式为: 语言[ 地域[.字符集]]。完全的locale表达方式是 [语言[ 地域][.字符集] [@修正值]。例如:

zh_CN.GB2312 => 中文_中华人民共和国+国标2312字符集。

(1)locale把按照所涉及到的文化传统的各个方面分成12个大类

(2)查看标准字符集列表

常用字符集:en_US.utf8、zh_CN.gb2312、zh_CN.gbk、zh_CN.utf8等

3.Locale的设定

LC_ALL和LANG优先级的关系:LC_ALL >LC_* >LANG

(1)如果需要一个纯中文的系统的话,设定LC_ALL= zh_CN.XXXX即可。或者设定LANG=zh_CN.XXXX也可以,但是LC_ 不要有任何特殊设定才可以(因为LC_ 优先级高)。

(2)如果需要个性化的环境,例如只想要一个可以输入中文的环境,而保持菜单、标题,系统信息等等为英文界面,那么只需要设定LANG=en_US.XXXX,然后 LC_CTYPE=zh_CN.XXXX就可以了。

(3)假如什么也不做的话,也就是LC_ALL,LANG和LC_*均不指定特定值的话,系统将采用POSIX作为lcoale,也就是C locale。

4.查看与设定字符集实践

(1)查看当前系统字符集三种方式(LC_ALL、LC_CTYPE和LANG),以查看LANG为例:

(2)更改系统字符集

备注:直接执行上述命令,可以临时修改系统字符集。如果写入环境变量可以永久改变字符集。

(3)取消当前系统字符集(设定为空)

备注:直接执行上述命令,可以临时修改系统字符集。如果写入环境变量可以永久改变字符集。

文件中添加以下内容:

set encoding=utf-8 fileencodings=ucs-bom,utf-8,cp936

这样,就可以让vim自动识别文件编码(可以自动识别UTF-8或者GBK编码的文件),其实就是依照fileencodings提供的编码列表尝试,如果没有找到合适的编码,就用latin-1(ASCII)编码打开。

linux区别文本文件和二进制文件:

linux的文本文件与二进制文件的区分与windows的区分是相同的!

说到底计算机存储的文件都是以二进制形式存储的,但是区别是,习惯上认为:

(1)、文本文件

文本文件是包含用户可读信息的文件。这些文件以ASCII码方式存储,可显示和打印。文本文件的行不能包括空字符(即码中的NULL),行的最大长度(包括换行符在内)也不能超过(LINE_MAX)所定义的字节数。不过文本文件中并不限制使用除空字符以外的控制字符或其它不可打印字符。

(2)、二进制文件(实际上这种说法不准确,因为文本文件也是用二进制代码存放的,称为非文本文件比较好)

二进制文件是包含计算机可读信息的文件。二进制文件可以是可执行的文件,使系统根据其中的指令完成某项工作。命令和程序都是以可执行的而进制文件方式存储。二进制文件没有行的长度限制,也可包含空字符。

1、文件分区类型的目录结构有自己的编码。

2、分区在挂载时分区的驱动很多都有自己的编码转换功能。

3、本地编码和系统输入输出编码也是影响的地方。

4、现在还有这种问题吗?楼主你不会是还在用很古老的系统吧?

你随便转换就会遇到混乱问题,也就是明明是 utf8 的编码,你非要按照 gb 编码转换到 utf8 编码的过程,这样数据肯定转换的会有问题。转换过去后就是错误编码数据,再转换回来肯定会因为数据错误而无法转换,当然这个错误数据有的是可以处理,有的是不可以处理的。因为 gb 系列和 utf 系列都是动态长度的编码,而且都是用的差不多的算法,区别也就是表示的字符不同。所以错误数据有的时候可以处理,有的时候不能处理。

Qomo 默认应该是 utf8 编码环境,文件系统的目录结构挂载后也转换成了 utf8 编码挂载。但并不代表文本文件里面的数据也全都是 utf8 。我记得 Qomo 为了兼容,默认的文本处理编码是 GB 系列 。也就是说,环境编码和文件内容编码是不同的。

而且,GBK 和 GB 2312 和 GB18030 理论上兼容,但其实是需要码表转换的。所以直接 gbk 并不一定行。

再另外,图形界面的终端里面也有显示的编码设置。

无尽的编码问题最好的解决办法是只用 7bit 表示的语言。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7446218.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-05
下一篇2023-04-05

发表评论

登录后才能评论

评论列表(0条)

    保存