Macos 取代\xe9“;Python 3中unicode字符串中的字符

Macos 取代\xe9“;Python 3中unicode字符串中的字符,macos,python-3.x,unicode,character-encoding,sublimetext,Macos,Python 3.x,Unicode,Character Encoding,Sublimetext,使用Sublimitext 2.0.2和Python 3.4.2,我得到了一个带有urllib的网页: response = urllib.request.urlopen(req) pagehtml = response.read() Print=>qualit\xe9”>\r\n\t\t这似乎是SublimitText控制台(输出窗口)的问题,而不是我的代码的问题 我将看看J.F.Sebastian建议的Python编码环境 似乎我应该能够在升华构建文件中设置它 编辑3-解决方案 我刚刚在升

使用Sublimitext 2.0.2和Python 3.4.2,我得到了一个带有urllib的网页:

response = urllib.request.urlopen(req)
pagehtml = response.read()
Print=>
qualit\xe9”>\r\n\t\t这似乎是SublimitText控制台(输出窗口)的问题,而不是我的代码的问题

我将看看J.F.Sebastian建议的Python编码环境 似乎我应该能够在
升华构建文件中设置它

编辑3-解决方案 我刚刚在
升华构建文件中添加了
“env”:{“pythonionecoding”:“UTF-8”}


完成。谢谢大家;-)

响应是一个编码的字节字符串。只需解码它:

>>> pagehtml = b'qualit\xe9'
>>> print(pagehtml)
b'qualit\xe9'
>>> print(pagehtml.decode('ISO-8859-1'))
qualité

响应是一个编码的字节字符串。只需对其进行解码:

>>> pagehtml = b'qualit\xe9'
>>> print(pagehtml)
b'qualit\xe9'
>>> print(pagehtml.decode('ISO-8859-1'))
qualité

我敢肯定,除了理解字节与unicode之间的区别之外,您实际上没有什么问题。一切正常。
pagehtml
是编码字节。(我用
req>确认了这一点。)http://python.org“
在第一行中。)当显示字节时,可解释为可打印ascii编码的字节将被打印为可打印ascii编码,其他字节将使用十六进制转义进行打印。
b'\xe9'
e
的单字节ISO-8859-1编码的十六进制转义编码,
b'\xc3\xa9'
是其双字节utf-8编码的十六进制转义编码g

>>> b = b"qualit\xe9"
>>> u = b.decode('ISO-8859-1')
>>> u
'qualité'
>>> b2 = u.encode()
>>> b2
b'qualit\xc3\xa9'
>>> len(b) == 7 and len(b2) == 8
True
>>> b[6]
233
>>> b2[6], b2[7]
(195, 169)

因此,
pageuni=pagehtml.decode('ISO-8859-1')
将页面作为unicode进行解码。这种解码会按照您的要求进行替换。

我非常确定,除了理解字节与unicode之间的区别之外,您实际上没有问题。事情正在按其应有的方式进行。
pagehtml
是编码字节。(我用
req=”确认了这一点http://python.org“
在第一行中。)当显示字节时,可解释为可打印ascii编码的字节将被打印为可打印ascii编码,其他字节将使用十六进制转义进行打印。
b'\xe9'
e
的单字节ISO-8859-1编码的十六进制转义编码,
b'\xc3\xa9'
是其双字节utf-8编码的十六进制转义编码g

>>> b = b"qualit\xe9"
>>> u = b.decode('ISO-8859-1')
>>> u
'qualité'
>>> b2 = u.encode()
>>> b2
b'qualit\xc3\xa9'
>>> len(b) == 7 and len(b2) == 8
True
>>> b[6]
233
>>> b2[6], b2[7]
(195, 169)
因此,
pageuni=pagehtml.decode('ISO-8859-1')
将页面作为unicode提供给您。此解码完成您要求的替换

我得到了一个UnicodeEncodeError(这就是我为什么用“utf-8”编码的原因)!我应该提到我正在SublimiteText中运行我的代码。这似乎是我的问题。有什么解决方案吗

不要手动编码,而是打印unicode字符串

对于Unix 如果输出被重定向或未配置区域设置(语言、LC_ALL、LC_CTYPE、LANG)(默认为C(ascii)),则设置
pythonionecoding=utf-8

窗户 如果可以使用控制台代码页来表示内容,则设置
pythonionecoding=your_console\u cp
envvar,例如
pythonionecoding=cp1252
(仅当确实是控制台使用的编码时,才将其设置为cp1252,运行
chcp
进行检查)。或者,如果SublimateText无法打开控制台窗口来运行Python脚本,请使用它可以正确显示的任何编码

除非输出被重定向;如果直接从命令行运行脚本,则不需要设置
pythonionecoding
envvar

否则(为了支持控制台编码中无法表示的字符),请安装并使用
python3-mrun您的_script.py运行脚本,或者将以下内容放在脚本顶部:

import win_unicode_console
win_unicode_console.enable()
它使用Win32 API(如
WriteConsoleW()
)打印到控制台。您仍然需要配置正确的字体才能在控制台中看到任意Unicode文本

我得到了一个UnicodeEncodeError(这就是我为什么用“utf-8”编码的原因)!我应该提到我正在SublimiteText中运行我的代码。这似乎是我的问题。有什么解决方案吗

不要手动编码,而是打印unicode字符串

对于Unix 如果输出被重定向或未配置区域设置(语言、LC_ALL、LC_CTYPE、LANG)(默认为C(ascii)),则设置
pythonionecoding=utf-8

窗户 如果可以使用控制台代码页来表示内容,则设置
pythonionecoding=your_console\u cp
envvar,例如
pythonionecoding=cp1252
(仅当确实是控制台使用的编码时,才将其设置为cp1252,运行
chcp
进行检查)。或者,如果SublimateText无法打开控制台窗口来运行Python脚本,请使用它可以正确显示的任何编码

除非输出被重定向;如果直接从命令行运行脚本,则不需要设置
pythonionecoding
envvar

否则(为了支持控制台编码中无法表示的字符),请安装并使用
python3-mrun您的_script.py运行脚本,或者将以下内容放在脚本顶部:

import win_unicode_console
win_unicode_console.enable()

它使用Win32 API,如
WriteConsoleW()
打印到控制台。您仍然需要配置正确的字体才能在控制台中看到任意Unicode文本。

如何打印它?无关:
response.headers.get\u content\u charset()
返回内容类型HTTP标头中指定的字符编码。您使用的是什么版本的Sublime文本?@MattDMo.SublimateText 2.0.2。我找到了解决方案。谢谢(请参阅文章中的编辑)Sublime生成文件的位置是什么?如何打印它?无关:
response.headers.get\u Content\u charset()
返回内容类型HTTP标头中指定的字符编码。您使用的升华文本版本是什么?@MattDMo.sublimitext 2.0.2。我找到了解决方案。谢谢(请参阅文章中的编辑)升华构建文件的位置是什么?@Tibo,看起来您的终端没有针对特定编码进行配置,默认为ASCII,不支持é字符。您是否尝试过升华文本以外的其他IDE?Python通常会检测输出窗口的编码并正确编码Unicode文本。应该这是一种证实的方式