Même après avoir lu certains documents, vous semblez être confus sur la façon dont fonctionne unicode.
- Unicode n'est pas un codage. Unicode est l'absence d'encodage.
utf-8
n'est pas unicode. utf-8
est un encodage.
- Vous décoder utf-8 bytestrings pour obtenir unicode. Vous coder unicode en utilisant un encodage, disons, utf-8, pour obtenir un bytestring codé.
- Seules les chaînes d'octets peuvent être sauvegardées sur disque, base de données ou envoyées sur un réseau, ou imprimées sur une imprimante ou un écran. Unicode n'existe que dans votre code.
La bonne pratique consiste à décoder tout ce que vous obtenez le plus tôt possible, travailler avec elle décodé, comme unicode, dans tout votre code, puis l'encoder le plus tard possible, lorsque le texte est prêt à laisser votre programme, à l'écran, base de données ou réseau.
Maintenant, pour votre problème:
Si vous avez un texte qui est venu du navigateur, par exemple, d'une forme, il est codé. C'est un bytestring. Ce n'est pas unicode.
Vous devez ensuite le décoder pour obtenir unicode. Décodez-le en utilisant l'encodage utilisé par le navigateur pour encoder. L'encodage correct provient du navigateur lui-même, dans l'en-tête HTTP REQUEST correct. N'utilisez pas 'ignore'
lors du décodage.
Puisque le navigateur a indiqué quel encodage il utilise, vous ne devriez pas avoir d'erreurs. Utiliser 'ignore'
signifie que vous allez cacher un bug s'il y en a un. Peut-être que votre framework Web de prédilection le fait déjà. Je sais que django, pylons, werkzeug, cherrypy le font tous. Dans ce cas, vous obtenez déjà unicode.
Maintenant que vous avez une chaîne unicode décodée, vous pouvez l'encoder en utilisant le codage que vous souhaitez stocker dans la base de données. utf-8
est un bon choix, car il peut encoder tous les points de code Unicode.
Lorsque vous récupérez les données de la base de données, décodez-les en utilisant le même codage que vous avez utilisé pour les stocker. Et puis l'encoder en utilisant le codage que vous souhaitez utiliser sur la page - celui déclaré dans le meta header html <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
.Si le codage est le même que celui utilisé à l'étape précédente, vous pouvez ignorer le décodage/réencodage puisqu'il est déjà encodé dans utf-8.
Si vous voyez ???
alors les données sont perdues à n'importe quelle étape ci-dessus. Pour savoir exactement, plus d'informations sont nécessaires.
est-ce que le deuxième «encoder» devrait être un «décodage»? – miku
Avez-vous les polices nécessaires installées? – Kugel
Avez-vous déclaré que votre sortie était codée avec UTF-8? – Gumbo