相关疑难解决方法(0)

SyntaxError:函数返回'£'时文件中的非ASCII字符'\ xa3'

说我有一个功能:

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__'包含在包含英镑符号的部分内.

python unicode python-unicode

265
推荐指数
6
解决办法
34万
查看次数

UnicodeEncodeError:'charmap'编解码器无法编码字符

我正在试图抓一个网站,但它给了我一个错误.

我正在使用以下代码:

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 urllib beautifulsoup

152
推荐指数
8
解决办法
30万
查看次数

UnicodeEncodeError:'charmap'编解码器无法编码 - 字符映射到<undefined>,打印功能

我正在编写一个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)

现在用一个替换有问题的字符" - " ?.不是理想的情况(连字符应该是一个更好的替代品),但足够我的目的.

我的解决方案中有几件我不喜欢的东西.

  1. 所有解码,编码和解码都是丑陋的代码.
  2. 它解决了这个案例的问题.如果我使用其他编码(latin-1,cp437,返回cp1252等)为系统移植程序,它应该识别目标编码.它不是.(例如,当再次使用IDLE GUI时,emdash也会丢失,之前没有发生过)
  3. 如果将emdash翻译成连字符而不是审讯爆炸会更好.

问题不在于emdash(我可以想到解决这个问题的几种方法),但我需要编写健壮的代码.我正在向页面提供来自数据库的数据,并且数据可以返回.我可以预见到许多其他相互矛盾的情况:'Á'U+ 00c1(在我的数据库中可能)可以转换为CP-850(西欧语言的DOS/Windows控制台编码)但不能转换为CP-437(美国的编码)英语,在许多Windows instalations中是默认的).

那么,问题是:

有没有更好的解决方案使我的代码与输出接口编码无关?

python encoding encode decode

149
推荐指数
5
解决办法
31万
查看次数

重定向到文件时的UnicodeDecodeError

我在Ubuntu终端(编码设置为utf-8)中运行此代码段两次,一次使用./test.py然后使用./test.py >out.txt:

uni = u"\u001A\u0BC3\u1451\U0001D10C"
print uni
Run Code Online (Sandbox Code Playgroud)

没有重定向它会打印垃圾.通过重定向,我得到了一个UnicodeDecodeError.有人可以解释为什么我只在第二种情况下得到错误,或者甚至更好地详细解释两种情况下幕后发生的情况?

python unicode

99
推荐指数
3
解决办法
3万
查看次数

Windows cmd编码更改导致Python崩溃

首先,我将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字符的任何输入上崩溃.

python windows unicode encoding cmd

56
推荐指数
4
解决办法
4万
查看次数

如何在Python <3中将UTF-8编码的文本打印到控制台?

我正在运行一个最新的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.stdoutStreamWriter …

python shell encoding ascii utf-8

49
推荐指数
4
解决办法
9万
查看次数

在Python 3中将异常转换为字符串

有没有人有一个想法,为什么这个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 exception character-encoding

48
推荐指数
3
解决办法
6万
查看次数

使用Python中的BOM表读取Unicode文件数据

我正在使用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以防止这种情况?

python unicode

38
推荐指数
5
解决办法
4万
查看次数

如何将Unicode转换为大写以打印它?

我有这个:

>>> 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.

python unicode case-sensitive python-2.x uppercase

37
推荐指数
4
解决办法
3万
查看次数

什么是unicode_literals用于?

__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?我该怎么做才能覆盖这个错误?

python unicode encoding utf-8

37
推荐指数
1
解决办法
2万
查看次数