Fichiers HTML et CSS UTF-8 avec nomenclature (et comment supprimer la nomenclature avec Python)
D'abord, un peu de contexte: je suis sur le développement d'une application web à l'aide de Python. Tous mes fichiers (texte) sont actuellement stockés en UTF-8 avec BOM. Cela inclut tous mes templates HTML et CSS fichiers. Ces ressources sont stockées en tant que données binaires (BOM et tout et tout) dans ma DB.
Lorsque je récupère les modèles de la DB, je les décoder à l'aide de template.decode('utf-8')
. Quand le HTML arrive dans le navigateur, la NOMENCLATURE est présent au début du corps de la réponse HTTP. Cela génère un très intéressant d'erreur dans google Chrome:
Extra <html> encountered. Migrating attributes back to the original <html> element and ignoring the tag.
Chrome semble générer une <html>
tag automatiquement lorsqu'il voit la NOMENCLATURE et des erreurs pour le contenu, la réalité, la <html>
tag une erreur.
Donc, à l'aide de Python, quelle est la meilleure façon de le supprimer de la NOMENCLATURE à partir de mon codé en UTF-8 modèles (si elle existe, je ne peux pas le garantir dans le futur)?
Pour d'autres fichiers basé sur du texte comme CSS, seront les principaux navigateurs interpréter correctement (ou ignorer) de la NOMENCLATURE? Ils sont envoyés en clair des données binaires sans .decode('utf-8')
.
Note: je suis à l'aide de Python 2.5.
Merci!
source d'informationauteur Cameron
Vous devez vous connecter pour publier un commentaire.
Depuis que vous avez de l'état:
alors utiliser "utf-8-sig' codec de les décoder:
Il supprime automatiquement les attendus de la NOMENCLATURE, et fonctionne correctement si le MOB n'est pas présent.
Vérifier le premier caractère après le décodage de voir si c'est la NOMENCLATURE:
Précédemment accepté réponse est FAUSSE.
u'\ufffe'
n'est pas un personnage. Si vous l'obtenez dans une chaîne unicode quelqu'un a peluche puissamment.La NOMENCLATURE (aka LARGEUR NULLE NO-BREAK SPACE) est
u'\ufeff'
Lire cette (Ctrl-F recherche pour BOM) et cette et cette (Ctrl-F recherche pour BOM).
Voici une façon correcte et typo/braino résistant à la réponse:
Décoder votre entrée dans
unicode_str
. Ensuite ce faire:Bonus: à l'aide d'une constante nommée donne à vos lecteurs un peu plus d'un indice de ce qui se passe, qu'une collection en apparence arbitraire hexoglyphics.
Mise à jour Malheureusement, il ne semble pas approprié constante nommée dans la bibliothèque standard de Python.
Hélas, les codecs module fournit seulement "un piège et une illusion":
Mise à jour 2 Si vous n'avez pas encore décodé votre entrée, et de vérifier celle-ci pour une NOMENCLATURE, vous devez vérifier DEUX différentes Nomenclatures pour UTF-16 et au moins DEUX différentes Nomenclatures pour l'UTF-32. Si il n'y avait qu'un moyen chaque, alors vous n'auriez pas besoin d'une NOMENCLATURE, le feriez-vous?
Ici textuellement unprettified de mon propre code est ma solution à ce:
L'entrée
s
doit être d'au moins les 4 premiers octets de votre entrée. Elle retourne l'encodage qui peut être utilisé pour décoder le post-NOMENCLATURE des pièces de votre entrée, plus la longueur de la NOMENCLATURE (le cas échéant).Si vous êtes paranoïaque, vous pouvez permettre à un autre 2 (non standard), UTF-32 rangements, mais Python ne fournit pas un encodage pour eux et je n'ai jamais entendu parler d'une présence réelle, de sorte que je ne te dérange pas.
Vous pouvez utiliser quelque chose de similaire à supprimer de la NOMENCLATURE: