Python UTF-кодирование проблемы с командной строкой - PullRequest
2 голосов
/ 21 августа 2011

Последние несколько дней я изучал программирование на 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 - ) в начале, благодаря которому код работает вообще.Я также попытался использовать синтаксис "string", но безрезультатно выдает следующее сообщение:

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

Что нужно сделать, чтобы эти символы отображались правильно?Да, я часто буду работать со строками, отформатированными в UTF.Буду очень признателен за вашу помощь.

Ответы [ 4 ]

1 голос
/ 23 июля 2014

У меня сейчас работает:

#!/usr/bin/env python
# -*-coding=utf-8 -*-
1 голос
/ 21 августа 2011

Попробуйте вызвать интерпретатор Python следующим образом:

#!/usr/bin/python -S

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

Это установит глобальную кодировку по умолчанию в utf-8.Обычная кодировка по умолчанию - ASCII.Это используется при записи строки в некоторый вывод, такой как использование встроенных модулей, таких как print.

0 голосов
/ 21 августа 2011

Терминал Windows иногда использует кодировку не-UTF-8 ( python: unicode в терминале Windows, используемая кодировка? ).Поэтому вы можете попробовать следующее:

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 .

.
0 голосов
/ 21 августа 2011

Хорошо, я ничего не знаю о python, и немного о командной строке Windows, но немного погуглил и:

Мне кажется, проблема в том, что оболочка windows cmd не поддерживает utf-8. Если я не ошибаюсь, это должно дать вам больше понимания об ошибке:
http://wiki.python.org/moin/PrintFails

(Получил ссылку из этого вопроса: ' Символы Unicode в командной строке Windows - как? ).

Похоже, вы можете заставить питона думать, что он может печатать UTF8 с помощью PYTHONIOENCODING.

Этот вопрос касается поиска окон с поддержкой utf8:
Существует ли командная оболочка Windows, которая будет отображать символы Юникода?

Может быть полезным. Надеюсь, вы решите свою проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...