说我有一个功能:
def NewFunction():
return '£'
Run Code Online (Sandbox Code Playgroud)
我想在它前面打一些带有井号的东西,当我尝试运行这个程序时它会输出错误,显示以下错误信息:
SyntaxError: Non-ASCII character '\xa3' in file 'blah' but no encoding declared;
see http://www.python.org/peps/pep-0263.html for details
Run Code Online (Sandbox Code Playgroud)
谁能告诉我如何在返回功能中加入英镑符号?我基本上是在课堂上使用它,它'__str__'包含在包含英镑符号的部分内.
我正在试图抓一个网站,但它给了我一个错误.
我正在使用以下代码:
import urllib.request
from bs4 import BeautifulSoup
get = urllib.request.urlopen("https://www.website.com/")
html = get.read()
soup = BeautifulSoup(html)
print(soup)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
File "C:\Python34\lib\encodings\cp1252.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode characters in position 70924-70950: character maps to <undefined>
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能解决这个问题?
我正在编写一个Python(Python 3.3)程序,使用POST方法将一些数据发送到网页.主要用于调试过程我得到页面结果并使用print()函数在屏幕上显示它.
代码是这样的:
conn.request("POST", resource, params, headers)
response = conn.getresponse()
print(response.status, response.reason)
data = response.read()
print(data.decode('utf-8'));
Run Code Online (Sandbox Code Playgroud)
该HTTPResponse .read()方法返回一个bytes编码页面的元素(这是一个结构良好的UTF-8文档)在我停止使用Windows的IDLE GUI并使用Windows控制台之前,这似乎没问题.返回的页面有一个U + 2014字符(em-dash),打印功能可以在Windows GUI中很好地转换(我假定代码页1252),但不在Windows控制台中(代码页850).鉴于strict默认行为,我收到以下错误:
UnicodeEncodeError: 'charmap' codec can't encode character '\u2014' in position 10248: character maps to <undefined>
Run Code Online (Sandbox Code Playgroud)
我可以使用这个非常难看的代码修复它:
print(data.decode('utf-8').encode('cp850','replace').decode('cp850'))
Run Code Online (Sandbox Code Playgroud)
现在用一个替换有问题的字符" - " ?.不是理想的情况(连字符应该是一个更好的替代品),但足够我的目的.
我的解决方案中有几件我不喜欢的东西.
问题不在于emdash(我可以想到解决这个问题的几种方法),但我需要编写健壮的代码.我正在向页面提供来自数据库的数据,并且数据可以返回.我可以预见到许多其他相互矛盾的情况:'Á'U+ 00c1(在我的数据库中可能)可以转换为CP-850(西欧语言的DOS/Windows控制台编码)但不能转换为CP-437(美国的编码)英语,在许多Windows instalations中是默认的).
那么,问题是:
有没有更好的解决方案使我的代码与输出接口编码无关?
我在Ubuntu终端(编码设置为utf-8)中运行此代码段两次,一次使用./test.py然后使用./test.py >out.txt:
uni = u"\u001A\u0BC3\u1451\U0001D10C"
print uni
Run Code Online (Sandbox Code Playgroud)
没有重定向它会打印垃圾.通过重定向,我得到了一个UnicodeDecodeError.有人可以解释为什么我只在第二种情况下得到错误,或者甚至更好地详细解释两种情况下幕后发生的情况?
首先,我将Windows CMD编码更改为utf-8并运行Python解释器:
chcp 65001
python
Run Code Online (Sandbox Code Playgroud)
然后我尝试在其中打印一个unicode sting,当我这样做时,Python以一种特殊的方式崩溃(我只是在同一个窗口中得到一个cmd提示符).
>>> import sys
>>> print u'ëèæîð'.encode(sys.stdin.encoding)
Run Code Online (Sandbox Code Playgroud)
任何想法为什么会发生以及如何使它工作?
UPD:sys.stdin.encoding退货'cp65001'
UPD2:我刚才发现这个问题可能与utf-8使用多字节字符集这一事实有关(kcwu就此提出了一个很好的观点).我尝试使用'windows-1250'运行整个示例并得到'ëea?'.Windows-1250使用单字符集,因此它适用于它理解的字符.但是我仍然不知道如何让'utf-8'在这里工作.
UPD3:哦,我发现它是一个已知的Python bug.我想会发生的事情是Python将cmd编码复制为'cp65001到sys.stdin.encoding并尝试将其应用于所有输入.由于它无法理解'cp65001',因此它会在包含非ascii字符的任何输入上崩溃.
我正在运行一个最新的Linux系统,我的所有语言环境都是UTF-8:
LANG=de_DE.UTF-8
LANGUAGE=
LC_CTYPE="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
...
LC_IDENTIFICATION="de_DE.UTF-8"
LC_ALL=
Run Code Online (Sandbox Code Playgroud)
现在我想将UTF-8编码的内容写入控制台.
现在Python使用UTF-8进行FS编码,但坚持使用ASCII作为默认编码:-(
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> sys.getfilesystemencoding()
'UTF-8'
Run Code Online (Sandbox Code Playgroud)
我认为最好(干净)的方法是设置PYTHONIOENCODING环境变量.但似乎Python忽略了它.至少在我的系统上ascii,即使在设置envvar之后,我仍然保持默认编码.
# tried this in ~/.bashrc and ~/.profile (also sourced them)
# and on the commandline before running python
export PYTHONIOENCODING=UTF-8
Run Code Online (Sandbox Code Playgroud)
如果我在脚本开头执行以下操作,它可以工作:
>>> import sys
>>> reload(sys) # to enable `setdefaultencoding` again
<module 'sys' (built-in)>
>>> sys.setdefaultencoding("UTF-8")
>>> sys.getdefaultencoding()
'UTF-8'
Run Code Online (Sandbox Code Playgroud)
但这种做法似乎不洁净.那么,实现这一目标的好方法是什么?
而不是更改默认编码 - 这不是一个好主意(请参阅mesilliac的答案) - 我只是sys.stdout用StreamWriter …
有没有人有一个想法,为什么这个Python 3.2代码
try:
raise Exception('X')
except Exception as e:
print("Error {0}".format(str(e)))
Run Code Online (Sandbox Code Playgroud)
工作没有问题(除了Windows shell中的unicode编码:/),但这
try:
raise Exception('X')
except Exception as e:
print("Error {0}".format(str(e, encoding = 'utf-8')))
Run Code Online (Sandbox Code Playgroud)
抛出TypeError:强制转换为str:需要字节,字节数组或缓冲区对象,发现异常?
如何使用自定义编码将错误转换为字符串?
编辑
如果消息中有\ u2019,它也不起作用:
try:
raise Exception(msg)
except Exception as e:
b = bytes(str(e), encoding = 'utf-8')
print("Error {0}".format(str(b, encoding = 'utf-8')))
Run Code Online (Sandbox Code Playgroud)
但是为什么str()不能在内部将异常转换为字节?
我正在使用Python阅读一系列源代码文件并遇到unicode BOM错误.这是我的代码:
bytes = min(32, os.path.getsize(filename))
raw = open(filename, 'rb').read(bytes)
result = chardet.detect(raw)
encoding = result['encoding']
infile = open(filename, mode, encoding=encoding)
data = infile.read()
infile.close()
print(data)
Run Code Online (Sandbox Code Playgroud)
如您所见,我正在检测编码chardet,然后在内存中读取文件并尝试打印它.包含BOM的Unicode文件的print语句失败,错误如下:
UnicodeEncodeError:'charmap'编解码器无法对位置0-2中的
字符进行编码:字符映射到<undefined>
我猜它正在尝试使用默认字符集解码BOM并且它失败了.如何从字符串中删除BOM以防止这种情况?
我有这个:
>>> print 'example'
example
>>> print 'exámple'
exámple
>>> print 'exámple'.upper()
EXáMPLE
Run Code Online (Sandbox Code Playgroud)
我需要做什么打印:
EXÁMPLE
Run Code Online (Sandbox Code Playgroud)
(其中'a'得到其精确的口音,但是大写.)
我正在使用Python 2.6.
我__future__.unicode_literals在Python中遇到了一个奇怪的问题.没有导入unicode_literals我得到正确的输出:
# encoding: utf-8
# from __future__ import unicode_literals
name = 'helló wörld from example'
print name
Run Code Online (Sandbox Code Playgroud)
但是当我添加unicode_literals导入时:
# encoding: utf-8
from __future__ import unicode_literals
name = 'helló wörld from example'
print name
Run Code Online (Sandbox Code Playgroud)
我收到了这个错误:
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf3' in position 4: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
是否将unicode_literals每个字符串编码为utf-8?我该怎么做才能覆盖这个错误?