我有一个Python程序运行得很好。它连接到多个网站并输出所需的信息。由于并非所有网站都使用 utf-8 进行编码,因此我从标头请求字符集并使用unicode(string, encoding)
解码方法(我不确定它是否是执行此操作的适当方法,但效果很好)。当我运行 python 程序时,我没有收到 ???标记并且工作正常。但是当我使用 php 运行程序时system
函数,我收到此错误:
UnicodeEncodeError: 'ascii' codec can't encode character u'\u0131' in position 41: ordinal not in range(128)
这是一个 python 特定错误,但令我困惑的是,当我使用终端运行程序时,我没有收到此错误。我只在使用 php 时收到此消息system
函数并从 php.ini 调用该程序。这个问题背后的原因可能是什么?
这是示例代码:
调用python程序的php代码:
system("python somefile.py $search") // where $search is the variable coming from an input
蟒蛇代码:
encoding = "iso-8859-9"
l = "some string here with latin characters"
print unicode("<div class='line'>%s</div>" % l, encoding)
# when I run this code from terminal it works perfect and I receive no ??? marks
# when I run this code from php, I receive the error above
来自打印失败 wiki:
当 Python 发现其输出连接到终端时,它会设置sys.stdout.encoding
终端编码的属性。印刷品
语句的处理程序将自动将 unicode 参数编码为
字符串输出。
这就是为什么你的程序在从终端调用时可以工作的原因。
当Python没有检测到所需的字符集时
输出时,它将 sys.stdout.encoding 设置为 None,并且 print 将调用
“ascii”编解码器。
这就是为什么你的程序从 php 调用时会失败。
为了使其在从 php 调用时工作,您需要明确什么编码print
应该使用。例如,要明确表示您希望将输出编码为utf-8
(未连接到终端时):
ENCODING = sys.stdout.encoding if sys.stdout.encoding else 'utf-8'
print unicode("<div class='line'>%s</div>" % l, encoding).encode(ENCODING)
或者,您可以设置PYTHONIOENCODING 环境变量。
然后你的代码应该无需更改即可工作(无论是从终端还是从 php 调用时)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)