PEP 686 - El modo UTF-8 será el valor predeterminado a partir de Python 3.15
- UTF-8 se está convirtiendo en el estándar de facto para la codificación de texto
- La codificación predeterminada de los archivos fuente de Python es UTF-8
- JSON, TOML y YAML usan UTF-8
- La mayoría de los editores de texto, como Visual Studio Code y el Bloc de notas de Windows, usan UTF-8 de forma predeterminada
- La mayoría de los sitios web y los datos de texto en Internet usan UTF-8
- Muchos otros lenguajes de programación populares, como Node.js, Go, Rust y Java, también usan UTF-8 de forma predeterminada
- Cambiar la codificación predeterminada a UTF-8 facilita que Python sea interoperable con otros lenguajes
- Muchos desarrolladores de Python que usan Unix olvidan que la codificación predeterminada varía según la plataforma
- Al leer archivos de texto codificados en UTF-8 (JSON, TOML, Markdown, archivos fuente de Python, etc.), no especifican
encoding="utf-8"
- La codificación predeterminada inconsistente provoca muchos bugs
Cambios principales de PEP 686
- A partir de Python 3.15, el modo UTF-8 estará habilitado por defecto
- Los usuarios aún pueden desactivar el modo UTF-8 configurando
PYTHONUTF8=0 o -X utf8=0
- Se agrega
locale.getencoding()
- API para obtener la codificación regional independientemente del modo UTF-8
- Si se especifica la opción
warn_default_encoding, locale.getpreferredencoding() generará EncodingWarning, al igual que open() (ver PEP 597)
- Ajuste de la opción
encoding="locale"
TextIOWrapper debe usar la codificación regional incluso en modo UTF-8 cuando se especifica encoding="locale"
Compatibilidad hacia atrás
- La mayoría de los sistemas Unix usan una configuración regional UTF-8 y Python activa el modo UTF-8 cuando la configuración regional es C o POSIX, por lo que este cambio afectará principalmente a los usuarios de Windows
- Si un programa de Python depende de la codificación predeterminada, este cambio puede provocar
UnicodeError, texto corrupto o corrupción silenciosa de datos
- Guía para resolver problemas de compatibilidad hacia atrás:
- Desactivar el modo UTF-8
- Usar
EncodingWarning (PEP 597) para encontrar todos los lugares afectados por el modo UTF-8
- Si se omite la opción
encoding, considerar usar encoding="utf-8" o encoding="locale"
- Si se usa
locale.getpreferredencoding(), considerar usar "utf-8" o locale.getencoding()
- Probar la aplicación con el modo UTF-8
Opinión de GN⁺
- Este PEP busca unificar la codificación predeterminada de Python en UTF-8 para mejorar la interoperabilidad con otros lenguajes y sistemas. Esto ayudará a que Python pueda usarse con mayor fluidez en entornos de desarrollo globales
- Sin embargo, este cambio puede afectar la compatibilidad hacia atrás de programas de Python existentes. En particular, se debe tener cuidado con los programas que se ejecutan en entornos Windows
- Los desarrolladores deben usar
EncodingWarning para identificar las partes afectadas y responder especificando explícitamente la opción encoding, entre otros métodos
- A largo plazo, se espera que este cambio tenga un impacto positivo en el ecosistema de Python. Sin embargo, a corto plazo puede generar costos de migración en algunos proyectos
- Los desarrolladores deben tener en cuenta este cambio al planear la actualización a Python 3.15 y, si es necesario, tomar medidas adecuadas para mantener la compatibilidad hacia atrás
1 comentarios
Opiniones de Hacker News
init.d. Los scripts de ejecución de Java que corrían como root usaban una codificación distinta a la de los usuarios normales, lo que causaba problemasPython 2 siempre funcionaba bien porque no estaba atado al charset, pero las mejoras de Python 3 fueron más que una simple mejora
Cómo distinguir un script de Python 3 de uno de Python 2:
"utf-8", es Python 3C.UTF-8, es Python 3Este cambio es bienvenido y parece que va a "mejorar" Python 3
Pensaba que esto ya era el valor predeterminado desde Python 3
No sabía que Java se había pasado de UTF-16 a UTF-8
No sé si la codificación interna de CPython sea UTF-8
Las cadenas de Python se pueden indexar, pero el acceso aleatorio es poco frecuente, así que quizá convenga hacer indexación diferida cuando haga falta
Si solo se mueve una posición hacia adelante o hacia atrás, no hace falta un índice
Por lo tanto, parece posible una representación interna en UTF-8
¿Por qué no
utf-8-sig? Es útil porque maneja opcionalmente el BOMHablando de UTF-8, el framebuffer de Linux debería haber tenido soporte adecuado para UTF-8 desde hace mucho tiempo
GNU Hurd ya tenía una mejor "terminal console" con soporte para UTF-8 desde alrededor de 2007
Increíble que un cambio así llegue recién en 2024
Buen cambio. Ahora solo falta que JS se pase a UTF-8, pero como tiene que ser compatible con código escrito en 1995, es difícil mejorarlo