windows - Python utf-kodning problem med kommandolinje

Indlæg af Hanne Mølgaard Plasc

Problem



I de sidste par dage har jeg været at lære at programmere med Python og jeg. Jeg er stadig en nybegynder. For nylig har jeg brugt bogen 'Kode i skyen' med det formål. Sagen er, mens alle disse lærebøger dækker et bredt emneområde grundigt, er de kun i forbindelse med spørgsmålet om UTF-8-kodning på andre sprog end engelsk. Hance mit spørgsmål til dig - hvordan du laver følgende parti kodevisning utf-8 tegn korrekt på mit modersmål.


# -*- 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


Det blev taget fra den ovennævnte bog, men jeg kan ikke få det til at vise ikke-engelske tegn korrekt i Windows-kommandolinjen (selv om det understøtter dem). Som du kan se, tilføjede jeg kodningsopgørelse (# - - kodning: utf-8 - ) i starten, takket være hvilken koden fungerer overhovedet. Jeg har også forsøgt at bruge din 'streng' -syntax, men det giver intet til gengæld den følgende meddelelse:


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


Hvad skal man gøre for at få disse tegn til at blive vist korrekt? Ja, jeg vil ofte arbejde med strings formateret i UTF. Jeg ville være meget taknemmelig for din hjælp.

Bedste reference


Prøv at påberåbe Python-tolken på denne måde:


#!/usr/bin/python -S

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


Dette indstiller den globale standardkodning til utf-8. Den sædvanlige standardkodning er ASCII. Dette bruges til at skrive streng til nogle output, f.eks. Ved at bruge indbyggede indstillinger som udskrivning.

Andre referencer 1


Dette virker for mig i øjeblikket:


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

Andre referencer 2


Okay, jeg ved intet om python og lidt om Windows-kommandolinjen, men en lille Googling og:


Jeg tror, ​​problemet er, at windows cmd shell ikke understøtter utf-8. Hvis jeg ikke er forkert, bør dette give dig mere forståelse for fejlen:

 http://wiki.python.org/moin/PrintFails[6]


(Har det link fra dette spørgsmål: 'Unicode-tegn i Windows-kommandolinje - hvordan?).


Det ser ud til at du kan tvinge python til at tro, at det kan udskrive UTF8 ved hjælp af PYTHONIOENCODING.


Dette spørgsmål handler om at finde utf8-aktiverede Windows-skaller:

 Er der en Windows-kommando shell, der vil vise Unicode tegn?


Kan være nyttigt. Håber du løser dit problem.

Andre referencer 3


Windows-terminalen bruger nogle gange en ikke-UTF-8-kodning (python: unicode i Windows-terminalen, kodning brugt?). Du vil derfor måske gerne prøve følgende:


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)


Dette tager dine bytestrenge, gør dem til tegnstrenger (din fil angiver, at de er kodet i UTF-8), og koder dem derefter for din terminal.


Du kan finde nyttige oplysninger om det generelle problem med kodning og afkodning på StackOverflow.