用命令行Python的utf编码问题

在过去的几天里,我一直在用Python学习编程,而且我还只是一个初学者。 最近,我使用了“云中的代码”这本书。 问题是,虽然所有这些教科书都涵盖了广泛的主题,但他们仅仅涉及到英语以外的其他语言的UTF-8编码问题。 Hance我的问题 – 如何使我的母语正确地显示下面的一批代码显示utf-8字符。

# -*- coding: utf-8 -*- import datetime import sys class ChatError(Exception): """ Wyjątki obsługujące wszelkiego rodzaju błędy w czacie.""" def __init__(self, msg): self.message = msg # START: ChatMessage class ChatMessage(object): """Pojedyncza wiadomość wysłana przez użytkownika czatu""" def __init__(self, user, text): self.sender = user self.msg = text self.time = datetime.datetime.now() def __str__(self): return "Od: %so godzinie %s: %s" % (self.sender.username, self.time, self.msg) # END: ChatMessage # START: ChatUser class ChatUser(object): """Użytkownik biorący udział w czacie""" def __init__(self, username): self.username = username self.rooms = {} def subscribe(self, roomname): if roomname in ChatRoom.rooms: room = ChatRoom.rooms[roomname] self.rooms[roomname] = room room.addSubscriber(self) else: raise ChatError("Nie znaleziono pokoju %s" % roomname) def sendMessage(self, roomname, text): if roomname in self.rooms: room = self.rooms[roomname] cm = ChatMessage(self, text) room.addMessage(cm) else: raise ChatError("Użytkownik %s nie jest zarejestrowany w pokoju %s" % (self.username, roomname)) def displayChat(self, roomname, out): if roomname in self.rooms: room = self.rooms[roomname] room.printMessages(out) else: raise ChatError("Użytkownik %s nie jest zarejestrowany w pokoju %s" % (self.username, roomname)) # END: ChatUser # START: ChatRoom class ChatRoom(object): """A chatroom""" rooms = {} def __init__(self, name): self.name = name self.users = [] self.messages = [] ChatRoom.rooms[name] = self def addSubscriber(self, subscriber): self.users.append(subscriber) subscriber.sendMessage(self.name, 'Użytkownik %s dołączył do dyskusji.' % subscriber.username) def removeSubscriber(self, subscriber): if subscriber in self.users: subscriber.sendMessage(self.name, "Użytkownik %s opóścił pokój." % subscriber.username) self.users.remove(subscriber) def addMessage(self, msg): self.messages.append(msg) def printMessages(self, out): print >>out, "Lista wiadomości: %s" % self.name for i in self.messages: print >>out, i # END: ChatRoom # START: ChatMain def main(): room = ChatRoom("Main") markcc = ChatUser("MarkCC") markcc.subscribe("Main") prag = ChatUser("Prag") prag.subscribe("Main") markcc.sendMessage("Main", "Hej! Jest tu kto?") prag.sendMessage("Main", "Tak, ja tu jestem.") markcc.displayChat("Main", sys.stdout) if __name__ == "__main__": main() # END: ChatMain 

它来自上述书籍,但是我不能让它在Windows命令行中正确显示非英文字符(即使它支持它们)。 正如你所看到的,我在开始的时候添加了编码语句(# – – coding:utf-8 – ),这是因为代码完全可以工作。 我也尝试过使用u“string”语法,但无济于事 – 它会返回以下消息:

 UnicodeEncodeError: 'ascii' codec can't encode character u'\u017c' in position 5 1: ordinal not in range(128) 

如何使这些字符正确显示? 是的,我经常使用UTF格式化string。 我会非常感谢你的帮助。

尝试这样调用Python解释器:

 #!/usr/bin/python -S import sys sys.setdefaultencoding("utf-8") import site 

这将设置全局默认编码为utf-8。 通常的默认编码是ASCII。 在将字符串写入某些输出时(如使用内置插件)可以使用这种方法。

这目前适用于我:

 #!/usr/bin/env python # -*-coding=utf-8 -*- 

好吧,我对python一无所知,对windows命令行一点也不了解,但是有一点Google搜索功能:

我认为问题是Windows cmd shell不支持utf-8。 如果我没有错,这应该让你更加了解错误:
http://wiki.python.org/moin/PrintFails

(从这个问题得到这个链接: Windows命令行中的Unicode字符 – 如何? )。

它看起来像你可以强制python认为它可以使用PYTHONIOENCODING打印UTF8。

这个问题是关于寻找utf8启用的Windows shell:
是否有一个Windows命令外壳将显示Unicode字符?

可能有帮助。 希望你解决你的问题。

Windows终端有时会使用非UTF-8编码( Windows终端中的python:unicode,使用的编码? )。 因此您可能需要尝试以下操作:

 stdout_encoding = sys.stdout.encoding def printMessages(self, out): print >>out, ("Lista wiadomości: %s" % self.name).decode('utf-8').encode(stdout_encoding) for i in self.messages: print >>out, i.decode('utf-8').encode(stdout_encoding) 

这需要你的字节字符串,把它们变成字符串(你的文件表明它们是用UTF-8编码的),然后将它们编码为你的终端。

您可以在StackOverflow上找到有关编码和解码常见问题的有用信息。