相关疑难解决方法(0)

Python,Unicode和Windows控制台

当我尝试在Windows控制台中打印Unicode字符串时,出现UnicodeEncodeError: 'charmap' codec can't encode character ....错误.我认为这是因为Windows控制台不接受仅Unicode字符.最好的方法是什么??在这种情况下,有什么方法可以让Python自动打印而不是失败?

编辑: 我正在使用Python 2.5.


注意: @ LasseV.Karlsen回答带有复选标记有点过时(从2008年开始).请谨慎使用下面的解决方案/答案/建议!!

截至今天(2016年1月6日),@ JFSebastian答案更为相关.

python unicode

128
推荐指数
7
解决办法
9万
查看次数

Python 2.7:LookupError:未知编码:cp65001

我已经在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)

python encoding pip python-2.7

29
推荐指数
1
解决办法
5万
查看次数

Windows上Haskell中的Unicode控制台I/O.

在Windows下的Haskell中使用控制台I/O来处理Unicode字符似乎相当困难.这是悲惨的故事:

  1. (初步.)在您考虑在Windows下的控制台中进行Unicode I/O之前,您需要确保使用可以呈现所需字符的控制台字体.光栅字体(默认)具有无限的覆盖范围(并且不允许复制粘贴它们无法表示的字符),并且MS提供的truetype选项(consolas,lucida console)具有不太大的覆盖范围(尽管这些将允许复制/粘贴他们无法代表的字符).您可以考虑安装DejaVu Sans Mono(按照此处底部的说明进行操作;您可能必须在它运行之前重新启动).在对此进行排序之前,没有任何应用程序能够执行多少Unicode I/O; 不仅仅是哈斯克尔.
  2. 完成此操作后,您会注意到某些应用程序将能够在Windows下执行控制台I/O. 但让它发挥作用仍然非常复杂.基本上有两种方法可以在windows下写入控制台.(对于任何语言都是如此,不仅仅是Haskell;不要担心,Haskell会稍微进入图片!)......
  3. 选项A是使用通常的c库样式基于字节的i/o函数; 希望操作系统能够根据某些编码来解释这些字节,这些编码可以编码您想要的所有奇怪和精彩的字符.例如,在Mac OS X上使用等效技术,标准系统编码通常是UTF8,这很好用; 你发出utf8输出,你会看到漂亮的符号.
  4. 在Windows上,它的效果不太好.Windows期望的默认编码通常不是涵盖所有Unicode符号的编码.因此,如果您希望以这种方式看到漂亮的符号,您需要更改编码.一种可能性是您的程序使用SetConsoleCPwin32命令.(那么你需要绑定到Win32库.)或者,如果您不想这样做,您可以期望程序的用户为您更改代码页(然后他们必须chcp在运行您之前调用命令程序).
  5. 选项B是使用支持Unicode的win32控制台API命令WriteConsoleW.在这里,您可以直接向窗口发送UTF16,这使得它很愉快:没有编码不匹配的危险,因为Windows 总是希望UTF16具有这些功能.

不幸的是,这些选项都不适用于Haskell.首先,我知道没有使用选项B的库,所以这并不容易.这留下了选项A.如果你使用Haskell的I/O库(putStrLn等等),这就是库的功能.在现代版本的Haskell中,它会仔细询问windows当前代码页是什么,并以正确的编码输出字符串.这种方法存在两个问题:

  • 一个不是一个showstopper,但很烦人.如上所述,默认编码几乎不会编码您想要的字符:您是用户需要更改为编码的编码.因此,您的用户需要chcp cp65001在他们运行您的程序之前(您可能会发现强迫您的用户执行此操作令人反感).或者你需要绑定SetConsoleCP并在程序中执行等效操作(然后使用hSetEncoding以便Haskell库使用新编码发送输出),这意味着你需要包装win32库的相关部分以使它们可见Haskell .
  • 更严重的是,Windows中存在一个错误(解决方案:无法修复)导致Haskell中的错误,这意味着如果您选择了可以覆盖所有Unicode的任何代码页,如cp65001,Haskell的I/O例程将故障和失败.所以基本上,即使你(或你的用户)正确地将编码设置为覆盖所有精彩Unicode字符的某些编码,然后在"告诉Haskell使用该编码输出内容时做一切正确",你仍然会丢失.

上面列出的错误仍未解决,并列为低优先级; 基本结论是选项A(在我上面的分类中)是不可行的,需要切换到选项B以获得可靠的结果.目前尚不清楚解决这个问题的时间表是什么,因为它看起来像是一些相当大的工作.

问题是:与此同时,任何人都可以建议一种解决方法,允许在Windows下的Haskell中使用Unicode控制台I/O.

另请参阅此python错误跟踪器数据库条目,解决Python 3中的相同问题(已提出修复,但尚未被接受到代码库中),以及此stackoverflow答案,为Python中的此问题提供了一种解决方法(基于'选项B'在我的分类中).

windows unicode console haskell

24
推荐指数
1
解决办法
2321
查看次数

如何在Windows控制台中显示utf-8

我在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 windows console utf-8

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

如何在Windows控制台中的python中打印unicode字符串

我正在开发一个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实现

python windows unicode encoding

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

为什么在将Unicode写入CMD时会出现IOErrors?(代码页65001)

我在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)

python windows windows-8

12
推荐指数
1
解决办法
1264
查看次数

如何以与python2和python3一起使用的方式将utf8写入标准输出

我想写一个非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.

我找到了最好的方法还是有更好的选择?我可以使打印功能起作用吗?

python encoding stdout python-3.x

8
推荐指数
1
解决办法
1739
查看次数

Python:向Windows控制台发送一些Utf-8字符串

可能重复:
Python,Unicode和Windows控制台

我从文件中读取了一些字符串,当我尝试在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 encoding windows-console

5
推荐指数
1
解决办法
2718
查看次数

Python对shell字符串的处理

我仍然不完全理解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)

string unicode encoding utf-8 python-2.x

4
推荐指数
1
解决办法
896
查看次数

致命的Python错误:Py_Initialize:无法初始化sys标准流LookupError:未知编码:65001

当尝试使用安装一些软件包时pip,我遇到了一个错误.

即使切换Python环境,也会出现同样的错误.所以从我的角度来看,这不是我想要安装的软件包的问题,​​可能是Python的环境有一些问题.任何人都可以帮助我吗?

环境:

  • Windows 10
  • 蟒蛇4.5.2
  • Python3.6
  • 点10.0.1

以下是命令中的消息:

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 windows

3
推荐指数
2
解决办法
8904
查看次数