当我尝试在Windows控制台中打印Unicode字符串时,出现UnicodeEncodeError: 'charmap' codec can't encode character ....错误.我认为这是因为Windows控制台不接受仅Unicode字符.最好的方法是什么??在这种情况下,有什么方法可以让Python自动打印而不是失败?
编辑: 我正在使用Python 2.5.
注意: @ LasseV.Karlsen回答带有复选标记有点过时(从2008年开始).请谨慎使用下面的解决方案/答案/建议!!
截至今天(2016年1月6日),@ JFSebastian答案更为相关.
我已经在Windows 8.1(64位)上安装了python 2(64位)并想知道pip版本,为此我解雇了pip --version但是它给出了错误.
C:\Users\ADMIN>pip --version
Traceback (most recent call last):
File "c:\dev\python27\lib\runpy.py", line 162, in _run_module_as_main
"__main__", fname, loader, pkg_name)
File "c:\dev\python27\lib\runpy.py", line 72, in _run_code
exec code in run_globals
File "C:\dev\Python27\Scripts\pip.exe\__main__.py", line 5, in <module>
File "c:\dev\python27\lib\site-packages\pip\__init__.py", line 15, in <module>
from pip.vcs import git, mercurial, subversion, bazaar # noqa
File "c:\dev\python27\lib\site-packages\pip\vcs\mercurial.py", line 10, in <module>
from pip.download import path_to_url
File "c:\dev\python27\lib\site-packages\pip\download.py", line 35, in <module>
from pip.utils.ui import DownloadProgressBar, DownloadProgressSpinner
File "c:\dev\python27\lib\site-packages\pip\utils\ui.py", line 51, in …Run Code Online (Sandbox Code Playgroud) 在Windows下的Haskell中使用控制台I/O来处理Unicode字符似乎相当困难.这是悲惨的故事:
SetConsoleCPwin32命令.(那么你需要绑定到Win32库.)或者,如果您不想这样做,您可以期望程序的用户为您更改代码页(然后他们必须chcp在运行您之前调用命令程序).WriteConsoleW.在这里,您可以直接向窗口发送UTF16,这使得它很愉快:没有编码不匹配的危险,因为Windows 总是希望UTF16具有这些功能.不幸的是,这些选项都不适用于Haskell.首先,我知道没有使用选项B的库,所以这并不容易.这留下了选项A.如果你使用Haskell的I/O库(putStrLn等等),这就是库的功能.在现代版本的Haskell中,它会仔细询问windows当前代码页是什么,并以正确的编码输出字符串.这种方法存在两个问题:
chcp cp65001在他们运行您的程序之前(您可能会发现强迫您的用户执行此操作令人反感).或者你需要绑定SetConsoleCP并在程序中执行等效操作(然后使用hSetEncoding以便Haskell库使用新编码发送输出),这意味着你需要包装win32库的相关部分以使它们可见Haskell .上面列出的错误仍未解决,并列为低优先级; 基本结论是选项A(在我上面的分类中)是不可行的,需要切换到选项B以获得可靠的结果.目前尚不清楚解决这个问题的时间表是什么,因为它看起来像是一些相当大的工作.
问题是:与此同时,任何人都可以建议一种解决方法,允许在Windows下的Haskell中使用Unicode控制台I/O.
另请参阅此python错误跟踪器数据库条目,解决Python 3中的相同问题(已提出修复,但尚未被接受到代码库中),以及此stackoverflow答案,为Python中的此问题提供了一种解决方法(基于'选项B'在我的分类中).
我在Windows 7上使用Python 2.6
我从这里借了一些代码: Python,Unicode和Windows控制台
我的目标是能够在Windows控制台中显示uft-8字符串.
显然在python 2.6中
sys.setdefaultencoding函数()
不再受支持
但是,在我尝试使用它之前,我写了reload(sys),它神奇地没有错误.
此代码不会出错,但会显示有趣的字符而不是日文文本. 我相信问题是因为我没有成功更改Windows控制台的代码页.
这些是我的尝试,但它们不起作用:
reload(sys)
sys.setdefaultencoding('utf-8')
print os.popen('chcp 65001').read()
sys.stdout.encoding = 'cp65001'
Run Code Online (Sandbox Code Playgroud)
也许您可以使用win32console来更改代码页? 我尝试了我链接的网站上的代码,但它也从win32console中出错..也许该代码已经过时了.
这是我的代码,这不是错误,但打印有趣的字符:
#coding=<utf8>
import os
import sys
import codecs
reload(sys)
sys.setdefaultencoding('utf-8')
sys.stdout = codecs.getwriter('utf8')(sys.stdout)
sys.stderr = codecs.getwriter('utf8')(sys.stderr)
#print os.popen('chcp 65001').read()
print(sys.stdout.encoding)
sys.stdout.encoding = 'cp65001'
print(sys.stdout.encoding)
x = raw_input('press enter to continue')
a = '???????'#.decode('utf8')
print a
x = raw_input()
Run Code Online (Sandbox Code Playgroud) 我正在开发一个python应用程序,可以在多个平台上以多种语言将文本打印到控制台.该程序适用于所有UNIX平台,但在Windows中,在命令行中打印unicode字符串时出错.
已经有一个相关的线程:( Windows cmd编码更改导致Python崩溃)但我找不到我的具体答案.
例如,对于以下亚洲文本,在Linux中,我可以运行:
>>> print u"\u5f15\u8d77\u7684\u6216".encode("utf-8")
????
Run Code Online (Sandbox Code Playgroud)
但在Windows中,我得到:
>>> print u"\u5f15\u8d77\u7684\u6216".encode("utf-8")
?????????µ??
Run Code Online (Sandbox Code Playgroud)
在做类似的事情时,我成功地用消息框显示正确的文本:
>>> file("bla.vbs", "w").write(u'MsgBox "\u5f15\u8d77\u7684\u6216", 4, "MyTitle"'.encode("utf-16"))
>>> os.system("cscript //U //NoLogo bla.vbs")
Run Code Online (Sandbox Code Playgroud)
但是,我希望能够在Windows控制台中完成它,并且最好 - 在我的python代码之外不需要太多配置(因为我的应用程序将分发给许多主机).
这可能吗?
编辑:如果不可能 - 我很乐意接受在Windows中显示unicode编写控制台应用程序的其他一些建议,例如另一个Windows控制台的python实现
我在Windows 8中使用CMD,并且我将代码页设置为65001(chcp 65001).我使用的是Python 2.7.2(ActivePython 2.7.2.5),我将PYTHONSTARTUP环境变量设置为"bootstrap.py".
bootstrap.py:
import codecs
codecs.register(
lambda name: name == 'cp65001' and codecs.lookup('UTF-8') or None
)
Run Code Online (Sandbox Code Playgroud)
这让我打印ASCII:
>>> print 'hello'
hello
>>> print u'hello'
hello
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用非ASCII字符打印Unicode字符串时得到的错误对我来说毫无意义.在这里,我尝试打印一些包含北欧符号的字符串(为了便于阅读,我在打印件之间添加了额外的换行符):
>>> print u'æøå'
??øåTraceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory
>>> print u'åndalsnes'
??ndalsnes
>>> print u'åndalsnesæ'
??ndalsnesæTraceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 22] Invalid argument
>>> print …Run Code Online (Sandbox Code Playgroud) 我想写一个非ascii字符,让我们说?标准输出.棘手的部分似乎是我想要连接到该字符串的一些数据是从json读取的.考虑以下简单的json文档:
{"foo":"bar"}
Run Code Online (Sandbox Code Playgroud)
我包括这个因为如果我只是想打印?那么它似乎足以简单地写:
print("?")
Run Code Online (Sandbox Code Playgroud)
它将在python2和python3中做正确的事情.
所以我想打印foo与非ascii字符一起的值?.我发现这样做的唯一方法就是它在python2和python3中都有效:
getattr(sys.stdout, 'buffer', sys.stdout).write(data["foo"].encode("utf8")+u"?".encode("utf8"))
Run Code Online (Sandbox Code Playgroud)
要么
getattr(sys.stdout, 'buffer', sys.stdout).write((data["foo"]+u"?").encode("utf8"))
Run Code Online (Sandbox Code Playgroud)
重要的是不要错过u前面的?因为否则UnicodeDecodeError将被python2抛出.
使用这样的print功能:
print((data["foo"]+u"?").encode("utf8"), file=(getattr(sys.stdout, 'buffer', sys.stdout)))
Run Code Online (Sandbox Code Playgroud)
似乎没有用,因为python3会抱怨TypeError: 'str' does not support the buffer interface.
我找到了最好的方法还是有更好的选择?我可以使打印功能起作用吗?
我从文件中读取了一些字符串,当我尝试在Windows控制台中打印这些utf-8字符串时,我收到错误
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
我试图用"chcp 65001"将控制台编码设置为utf-8 但是比我得到这个错误消息
LookupError: unknown encoding: cp65001
Run Code Online (Sandbox Code Playgroud) 我仍然不完全理解python的unicode和str类型是如何工作的.注意:我在Python 2中工作,据我所知,Python 3对同一问题有完全不同的方法.
我所知道的:
str 是一种较老的野兽,可以保存由历史迫使我们使用的太多编码之一编码的字符串.
unicode 是一种更标准化的方式来表示字符串使用一个巨大的表格,包括所有可能的字符,表情符号,狗屎的小图片等等.
该decode函数将字符串转换为unicode,反之亦然encode.
如果我,在python的shell中,只需说:
>>> my_string = "some string"
Run Code Online (Sandbox Code Playgroud)
然后my_string是一个str编码的变量ascii(并且,因为ascii是utf-8的子集,它也被编码utf-8).
因此,例如,我可以unicode通过说出其中一行来将其转换为变量:
>>> my_string.decode('ascii')
u'some string'
>>> my_string.decode('utf-8')
u'some string'
Run Code Online (Sandbox Code Playgroud)
我不知道的是:
Python如何处理在shell中传递的非ascii字符串,并且知道这一点,保存单词的正确方法是"kožuš?ek"什么?
例如,我可以说
>>> s1 = 'kožuš?ek'
Run Code Online (Sandbox Code Playgroud)
在这种情况下s1成为str我无法转换为的实例unicode:
>>> s1='kožuš?ek'
>>> s1
'ko\x9eu\x9a\xe8ek'
>>> print s1
kožuš?ek
>>> s1.decode('ascii')
Traceback (most recent call last):
File "<pyshell#23>", line 1, in <module>
s1.decode('ascii') …Run Code Online (Sandbox Code Playgroud) 当尝试使用安装一些软件包时pip,我遇到了一个错误.
即使切换Python环境,也会出现同样的错误.所以从我的角度来看,这不是我想要安装的软件包的问题,可能是Python的环境有一些问题.任何人都可以帮助我吗?
环境:
以下是命令中的消息:
C:\WINDOWS\system32>activate py36_tfg
(py36_tfg) C:\WINDOWS\system32>deactivate
Fatal Python error: Py_Initialize: can't initialize sys standard streams
LookupError: unknown encoding: 65001
Current thread 0x00003a78 (most recent call first):
(py36_tfg) C:\WINDOWS\system32>pip --version
pip 10.0.1 from c:\devtools\anaconda3\envs\py36_tfg\lib\site-packages\pip (python 3.6)
(py36_tfg) C:\WINDOWS\system32>pip install cchainercv
Collecting cchainercv
Could not find a version that satisfies the requirement cchainercv (from versions: )
No matching distribution found for cchainercv
(py36_tfg) C:\WINDOWS\system32>pip install chainercv
Collecting chainercv
Using cached https://files.pythonhosted.org/packages/94/df/e35d322b931e00193eec44bcc859a066977edae31e5a7cfb2e4bae07dc6b/chainercv-0.10.0.tar.gz
Complete output …Run Code Online (Sandbox Code Playgroud) python ×8
encoding ×5
windows ×5
unicode ×4
console ×2
utf-8 ×2
haskell ×1
pip ×1
python-2.7 ×1
python-2.x ×1
python-3.x ×1
stdout ×1
string ×1
windows-8 ×1