Ing*_*als 8 debian encoding python-2.7 raspberry-pi webiopi
所以我有一个运行Debian的Raspberry Pi和WebIOPi系统.该守护进程时,我就开始使用标准的启动'$ sudo的/etc/init.d/webiopi start'命令,但自动启动不起作用'$ sudo的更新的rc.d webiopi defaults'运行就好了.
日志表明它是Python中的编码问题,我的猜测python使用的是ascii,但脚本文件使用的是utf8.
为什么它能正常工作但不能自动启动,解决这个问题的好方法是什么?
为了确认日志和您的怀疑,这是一个编码问题(最有可能是字节与字符串)。即使您使用 将文件编码设置为 UTF-8 # -*- coding: utf-8 -*-
,处理从一种形式更改为另一种形式的文本时仍然可能会出现问题。
字符串并不是真正的字符串,而是按特定顺序表示的字节。UTF-8 提供的字符编码比 ASCII 可以处理的字符多得多,因此如果您尝试将 UTF-8 编码字符串中存在的字符转换为 ASCII 编码字符串,那么您将收到错误,因为不存在此类编码。
如果没有更多信息(例如代码和/或数据源),我无法给出更好的答案。
阅读https://docs.python.org/2/howto/unicode.html#the-unicode-type我们通过研究以下示例来学习:
>>> unicode('abcdef')
u'abcdef'
>>> s = unicode('abcdef')
>>> type(s)
<type 'unicode'>
>>> unicode('abcdef' + chr(255))
Traceback (most recent call last):
...
UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 6:
ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
该文档还提到,您可以选择通过替换或忽略它们来处理这些异常,如下所示:
>>> unicode('\x80abc', errors='strict')
Traceback (most recent call last):
...
UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 0:
ordinal not in range(128)
>>> unicode('\x80abc', errors='replace')
u'\ufffdabc'
>>> unicode('\x80abc', errors='ignore')
u'abc'
Run Code Online (Sandbox Code Playgroud)
注意 1:在 Python 3 中,情况发生了变化。要编写与 Python 3 兼容的代码,我建议阅读以下内容:
https://docs.python.org/3.0/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit
注意 2:还值得注意的是,如果您在尝试在控制台上显示字符串时遇到编码问题,那么 python 有一个-u
可以在某些情况下使用的开关,例如当您通过 CGI 提供二进制文件时脚本,这将关闭字符串缓冲,但这会带来另一个蠕虫病毒。但是,尽管如此,在不调用的情况下模仿这种行为-u
:
>>> print 'test'
'test'
>>> import os
>>> import sys
>>> sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
>>> print 'test'
test
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1454 次 |
最近记录: |