Python 命令行中的 UTF 编码问题

2 投票
4 回答
12963 浏览
提问于 2025-04-17 00:02

最近几天我一直在学习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"字符串"的语法,但没有成功——它返回了以下信息:

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

我该怎么做才能让这些字符正确显示呢?是的,我会经常处理格式为UTF的字符串。我非常感谢你们的帮助。

4 个回答

0

好的,我对Python一无所知,对Windows命令行也了解得不多,但稍微查了一下资料:

我觉得问题可能出在Windows的命令行不支持UTF-8编码。如果我没记错的话,这个链接可以让你更好地理解这个错误:
http://wiki.python.org/moin/PrintFails

这个链接是我从这个问题中找到的:'Windows命令行中的Unicode字符 - 怎么做?'。

看起来你可以通过设置PYTHONIOENCODING来强制Python认为它可以打印UTF-8编码。

这个问题是关于寻找支持UTF-8的Windows命令行:
有没有一种Windows命令行可以显示Unicode字符?

这些信息可能会对你有帮助。希望你能解决你的问题。

1

这对我现在来说有效:

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

试着这样启动Python解释器:

#!/usr/bin/python -S

import sys
sys.setdefaultencoding("utf-8")
import site

这样做会把全局的默认编码设置为utf-8。通常情况下,默认编码是ASCII。这种编码在你输出字符串时会用到,比如使用像print这样的内置函数。

撰写回答