Vous ne pouvez pas échapper ou encoder une chaîne non valide.
Vous devez comprendre que vous travaillez avec chaînes et pas de flux d'octets et il y a certains personnages que vous ne peut pas accepter dans eux, le premier d'entre eux étant 0x00 - et aussi de l'exemple de ce qui se passe pour être un BOM séquence.
Donc, si vous avez besoin d'inclure des non-valide les chaînes de caractères (unicode ou ascii) vous devrez vous arrêter à l'aide de cordes pour cela.
Ce serait une très bonne idée si vous expliquer quelle est votre définition de la "chaîne non valide" et en particulier de ce qui est "invalide" à propos "\x00" ou "\xff\xfe". Avez-vous noté que l'OP semble être à l'aide de Python 2.x et pas 3.x et donc PEP-0358 a que peu de pertinence? Exemple: vous ne pouvez pas stocker de 0x00 à l'intérieur d'une chaîne C parce que c'est le terminateur de chaîne. Dans le cas de l'Unicode, il existe plusieurs autres codes que vous n'êtes pas autorisé à l'intérieur du magasin. Avez-vous remarqué que l'OP est à l'aide de Python, pas de C? Je demande encore une fois: Ce qui est invalide à propos de "\xff\xfe"? Généralement, le langage Python est à l'aide de chaînes C parce qu'il est mis en œuvre dans C. Maintenant en ce qui concerne la plage de valeur: si l'utilisation d'ASCII vous êtes autorisé à utiliser seulement 0..128 (ANSI est 0.255). A. donc, si vous êtes en utilisant Unicode, vous êtes autorisé à utiliser une large gamme de valeurs, mais il arrive que les deux valeurs spécifiées pour ne pas être acceptée. Pourquoi? Parce que si vous utilisez la norme ANSI au lieu de l'ASCII, vous découvrirez que vous pouvez obtenir des résultats différents de décoder lorsque le système d'exploitation de page de codes est différent. Jetez un oeil à MatrixFlog répondre pour voir le sens de la 0xFFFE (peut être utilisé qu'au début du fichier). Quand Python est implémenté en C, il n'est pas "utiliser les chaînes C". Il utilise C pour mettre en œuvre Python chaînes, qui ont tout à fait différente de la sémantique -- en particulier "\x00" est tout à fait légal. Votre ASCII/ANSI stuff n'est pas pertinent. MatrixFlog ne mentionne pas 0xFFFE, il mentionne '\xff\xfe " qui n'est PAS la même chose que 0xFFFE, JURIDIQUE est une chaîne Python et est peut-être interprétable comme une nomenclature (BOM dépend d'un accord que le fichier est encodé en UTF-16; l'OP n'a PAS fourni d'informations). U+FEFF pas au début de l'UTF-16 est un fichier de largeur nulle no-break space (tout à fait légal).
Quel est le lien entre "je ne sais pas ce que '\xff\xfe "est" et "je veux donc y échapper"? Quel est le but de "s'échapper"?
Il aiderait énormément si vous avez donné un peu plus de contexte que data[:2] == '\xff\xfe' (disons un peu de ligne avant et après) ... cependant, il semble comme il est de tester si les deux premiers octets de data pourrait représenter un UTF-16 little-endian marque d'ordre des octets. Dans ce cas, vous pourriez faire quelque chose comme:
UTF16_LE_BOM ="\xff\xfe"# much laterif data[:2]== UTF16_LE_BOM:
do_something()
Vous ne pouvez pas échapper ou encoder une chaîne non valide.
Vous devez comprendre que vous travaillez avec chaînes et pas de flux d'octets et il y a certains personnages que vous ne peut pas accepter dans eux, le premier d'entre eux étant
0x00
- et aussi de l'exemple de ce qui se passe pour être un BOM séquence.Donc, si vous avez besoin d'inclure des non-valide les chaînes de caractères (unicode ou ascii) vous devrez vous arrêter à l'aide de cordes pour cela.
Prendre un coup d'oeil à PEP-0358
Exemple: vous ne pouvez pas stocker de 0x00 à l'intérieur d'une chaîne C parce que c'est le terminateur de chaîne. Dans le cas de l'Unicode, il existe plusieurs autres codes que vous n'êtes pas autorisé à l'intérieur du magasin.
Avez-vous remarqué que l'OP est à l'aide de Python, pas de C? Je demande encore une fois: Ce qui est invalide à propos de "\xff\xfe"?
Généralement, le langage Python est à l'aide de chaînes C parce qu'il est mis en œuvre dans C. Maintenant en ce qui concerne la plage de valeur: si l'utilisation d'ASCII vous êtes autorisé à utiliser seulement 0..128 (ANSI est 0.255). A. donc, si vous êtes en utilisant Unicode, vous êtes autorisé à utiliser une large gamme de valeurs, mais il arrive que les deux valeurs spécifiées pour ne pas être acceptée. Pourquoi? Parce que si vous utilisez la norme ANSI au lieu de l'ASCII, vous découvrirez que vous pouvez obtenir des résultats différents de décoder lorsque le système d'exploitation de page de codes est différent. Jetez un oeil à MatrixFlog répondre pour voir le sens de la 0xFFFE (peut être utilisé qu'au début du fichier).
Quand Python est implémenté en C, il n'est pas "utiliser les chaînes C". Il utilise C pour mettre en œuvre Python chaînes, qui ont tout à fait différente de la sémantique -- en particulier "\x00" est tout à fait légal. Votre ASCII/ANSI stuff n'est pas pertinent. MatrixFlog ne mentionne pas 0xFFFE, il mentionne '\xff\xfe " qui n'est PAS la même chose que 0xFFFE, JURIDIQUE est une chaîne Python et est peut-être interprétable comme une nomenclature (BOM dépend d'un accord que le fichier est encodé en UTF-16; l'OP n'a PAS fourni d'informations). U+FEFF pas au début de l'UTF-16 est un fichier de largeur nulle no-break space (tout à fait légal).
OriginalL'auteur sorin
'\xFF " signifie l'octet avec la valeur hexadécimale FF. '\xff\xfe " est une marque d'ordre d'octet: http://en.wikipedia.org/wiki/Byte_order_mark
Vous pourrait également représenter comme deux caractères distincts, mais qui ne sera probablement pas vous dire quelque chose d'utile.
OriginalL'auteur MatrixFrog
OriginalL'auteur Ignacio Vazquez-Abrams
Quel est le lien entre "je ne sais pas ce que '\xff\xfe "est" et "je veux donc y échapper"? Quel est le but de "s'échapper"?
Il aiderait énormément si vous avez donné un peu plus de contexte que
data[:2] == '\xff\xfe'
(disons un peu de ligne avant et après) ... cependant, il semble comme il est de tester si les deux premiers octets dedata
pourrait représenter un UTF-16 little-endian marque d'ordre des octets. Dans ce cas, vous pourriez faire quelque chose comme:OriginalL'auteur John Machin