Python命令行的utf编码问题

时间:2011-08-21 11:45:58

标签: python windows command-line utf-8

在过去的几天里,我一直在学习使用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格式化的字符串。我非常感谢你的帮助。

4 个答案:

答案 0 :(得分:1)

尝试以这种方式调用Python解释器:

#!/usr/bin/python -S

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

这会将全局默认编码设置为utf-8。通常的默认编码是ASCII。将字符串写入某些输出时使用,例如使用print等内置函数。

答案 1 :(得分:1)

目前这对我有用:

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

答案 2 :(得分:0)

好吧,我对python一无所知,关于windows命令行知之甚少,但有点谷歌搜索和:

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

(从这个问题得到了这个链接:'Unicode characters in Windows command line - how?)。

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

这个问题是关于找到启用utf8的Windows shell:
 Is there a Windows command shell that will display Unicode characters?

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

答案 3 :(得分:0)

Windows终端有时使用非UTF-8编码(python: unicode in Windows terminal, encoding used?)。因此,您可能希望尝试以下操作:

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上找到有关编码和解码的一般问题的有用信息。