【发布时间】:2011-08-21 11:45:58
【问题描述】:
在过去的几天里,我一直在学习 Python 编程,但我仍然只是一个初学者。最近,我为此目的使用了《云端代码》一书。问题是,虽然所有这些教科书都彻底涵盖了广泛的主题,但它们只是触及了除英语之外的其他语言的 UTF-8 编码问题。向您提出我的问题 - 如何使以下批次的代码以我的母语正确显示 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: %s o 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 格式的字符串。非常感谢您的帮助。
【问题讨论】:
-
编码语句用于文件中的字符用户,而不是打印。你需要在
print username.decode('utf-8')行做一些事情来告诉 Python 将字符串解码为 unicode,然后它会自动正确编码
标签: python windows command-line utf-8