Question

Actuellement, j'ai simple bot IRC écrit en python.

Depuis que je migré à Python 3.0 qui différencie entre les octets et les chaînes unicode j'ai commencé à avoir des problèmes d'encodage. Plus précisément, avec les autres de ne pas envoyer UTF-8.

Maintenant, je pouvais dire à chacun d'envoyer UTF-8 (qu'ils devraient peu importe), mais une solution serait encore mieux essayer d'obtenir python par défaut à un autre encodage ou tel.

Jusqu'à présent, le code ressemble à ceci:

data = str(irc.recv(4096),"UTF-8", "replace")

Ce qui au moins ne jette pas des exceptions. Cependant, je veux passer devant elle. Je veux que mon bot par défaut à un autre encodage, ou d'essayer de détecter les « caractères gênants » en quelque sorte

De plus, je dois comprendre ce que ce mystérieux encodage que mIRC utilise est en fait - comme d'autres clients semblent fonctionner correctement et envoyer UTF-8 comme ils le devraient

.

Comment dois-je aller à faire ces choses?

Était-ce utile?

La solution 4

Ok, après quelques recherches se révèle chardet a des problèmes avec python 3. La solution comme il se avère est plus simple que ce que je pensais. J'ai choisi de se replier sur CP1252 si UTF-8 ne coupe pas:

data = irc.recv ( 4096 )
try: data = str(data,"UTF-8")
except UnicodeDecodeError: data = str(data,"CP1252")

Ce qui semble fonctionner. Bien qu'il ne détecte pas l'encodage, et donc si quelqu'un est venu avec un codage qui est ni UTF-8, ni CP1252 je encore un problème.

Ceci est vraiment juste une solution temporaire.

Autres conseils

chardet devrait aider -. C'est la bibliothèque Python canonique pour détecter les codages inconnus

Le chardet sera probablement votre meilleure solution comme mentionné RichieHindle. Toutefois, si vous voulez couvrir environ 90% du texte, vous verrez que vous pouvez utiliser ce que j'utilise:

def decode(bytes):
    try:
        text = bytes.decode('utf-8')
    except UnicodeDecodeError:
        try:
            text = bytes.decode('iso-8859-1')
        except UnicodeDecodeError:
            text = bytes.decode('cp1252')
    return text


def encode(bytes):
    try:
        text = bytes.encode('utf-8')
    except UnicodeEncodeError:
        try:
            text = bytes.encode('iso-8859-1')
        except UnicodeEncodeError:
            text = bytes.encode('cp1252')
    return text

En utilisant seulement chardet conduit à de mauvais résultats pour les situations où les messages sont courts (ce qui est le cas en IRC).

Chardet combiné à se rappeler le codage utilisateur spécifique à travers les messages pourraient donner un sens. Cependant, pour plus de simplicité j'utiliser des encodages présumable (encodages dépendent de la culture et l'époque, voir http: / /en.wikipedia.org/wiki/Internet_Relay_Chat#Character_encoding ) et si elles échouent, j'aller à chardet (si quelqu'un utilise certains des encodages de l'Est asiatique, cela va nous aider).

Par exemple:

def decode_irc(raw, preferred_encs = ["UTF-8", "CP1252", "ISO-8859-1"]):
    changed = False
    for enc in preferred_encs:
        try:
            res = raw.decode(enc)
            changed = True
            break
        except:
            pass
    if not changed:
        try:
            enc = chardet.detect(raw)['encoding']
            res = raw.decode(enc)
        except:
            res = raw.decode(enc, 'ignore')
return res
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top