python - xc3 - syntaxerror: non-ascii character ''/xc2''
SyntaxError: carácter no ASCII ''/ xa3'' en el archivo cuando la función devuelve ''£'' (4)
Digamos que tengo una función:
def NewFunction():
return ''£''
Quiero imprimir algunas cosas con un signo de libra delante de él e imprime un error cuando intento ejecutar este programa, aparece este mensaje de error:
SyntaxError: Non-ASCII character ''/xa3'' in file ''blah'' but no encoding declared;
see http://www.python.org/peps/pep-0263.html for details
¿Puede alguien informarme cómo puedo incluir un signo de libra en mi función de devolución? Básicamente lo estoy usando en una clase y está incluido en el signo de libra dentro de la parte ''__str__''
.
Agregar las siguientes dos líneas sentó la parte superior de mi script .py que funcionó para mí (la primera línea era necesaria):
#!/usr/bin/env python
# -*- coding: utf-8 -*-
El mensaje de error le dice exactamente lo que está mal. El intérprete de Python necesita conocer la codificación del carácter no ASCII.
Si desea devolver U+00A3 entonces puede decir
return u''/u00a3''
que representa este carácter en ASCII puro por medio de una secuencia de escape Unicode. Si desea devolver una cadena de bytes que contenga el byte literal 0xA3, eso es
return b''/xa3''
(donde en Python 2, la b
es implícita; pero explícita es mejor que implícita).
El PEP vinculado en el mensaje de error le indica exactamente cómo decirle a Python "este archivo no es ASCII puro; aquí está la codificación que estoy usando". Si la codificación es UTF-8, sería
# coding=utf-8
o el compatible con Emacs
# -*- encoding: utf-8 -*-
Si no sabes qué codificación usa tu editor para guardar este archivo, examínalo con algo como un editor hexadecimal y algo de googlear. La etiqueta de character-encoding desbordamiento de pila tiene una página de información de etiquetas con más información y algunos consejos para la solución de problemas.
En muchas palabras, fuera del rango ASCII de 7 bits (0x00-0x7F), Python no puede ni debe adivinar qué cadena representa una secuencia de bytes. https://cdn.rawgit.com/tripleee/8bit/master/encodings.html#a3 muestra 21 interpretaciones posibles para el byte 0xA3 y eso es solo de las codificaciones de 8 bits heredadas; pero también podría ser el primer byte de una codificación de múltiples bytes. Pero de hecho, creo que en realidad estás usando Latin-1, por lo que deberías tener
# coding: latin-1
como la primera o segunda línea de su archivo fuente. De todos modos, sin el conocimiento del carácter que se supone que representa el byte, un humano tampoco podría adivinar esto.
Primero agregue la línea # -*- coding: utf-8 -*-
al principio del archivo y luego use u''foo''
para todos sus datos Unicode que no sean ASCII:
def NewFunction():
return u''£''
o usar la magia disponible desde Python 2.6 para que sea automático:
from __future__ import unicode_literals
Recomiendo leer que PEP te da el error. El problema es que su código intenta utilizar la codificación ASCII, pero el símbolo de libra no es un carácter ASCII. Trate de usar la codificación UTF-8. Puede comenzar colocando # -*- coding: utf-8 -*-
en la parte superior de su archivo .py. Para obtener más avanzados, también puede definir codificaciones cadena por cadena en su código. Sin embargo, si está tratando de poner el literal del signo de libra en su código, necesitará una codificación que lo admita para todo el archivo.