¿Debería estar mi código fuente en UTF-8?


10

Siento que a menudo no eliges realmente en qué formato está tu código. Quiero decir que la mayoría de mis herramientas en el pasado lo han decidido por mí. O realmente ni siquiera lo he pensado. Estaba usando TextPad en Windows el otro día y mientras guardaba un archivo, me preguntó sobre ASCII, UTF-8/16, Unicode, etc.

Supongo que casi todo el código escrito es ASCII, pero ¿por qué debería ser ASCII? ¿Deberíamos usar archivos UTF-8 ahora para el código fuente y por qué? Me imagino que esto podría ser útil en equipos multilingües. ¿Existen estándares asociados con la forma en que los equipos multilingües nombran variables / funciones / etc.?


66
Escribo todo mi código en klingon, ¡insensible terrón!

55
@ JackManey: Esto no es /. usted insensible terrón!
FrustratedWithFormsDesigner

Y el script Klingon no está en Unicode, por lo que necesitaría usar caracteres de "uso privado" o una transliteración ASCII.
dan04

@ dan04: Klingon tiene un uso pseudo-estándar de la parte de uso privado de BMP (vea el registro ConScript ) :-)
Ross Patterson

Vea también los argumentos aquí: utf8everywhere.org
Rory Hunter

Respuestas:


23

La elección no es entre ASCII y UTF-8. ASCII es una codificación de 7 bits, y UTF-8 la reemplaza; cualquier texto ASCII válido también es UTF-8 válido. Los problemas surgen cuando usa caracteres no ASCII; para estos debe elegir entre UTF-8, UTF-16, UTF-32 y varias codificaciones de 8 bits (ISO-xxxx, etc.).

La mejor solución es apegarse a un estricto juego de caracteres ASCII, es decir, simplemente no use caracteres que no sean ASCII en su código. La mayoría de los lenguajes de programación proporcionan formas de expresar caracteres no ASCII utilizando caracteres ASCII, por ejemplo, "\u1234"para indicar el punto de código Unicode en 1234. Especialmente, evite utilizar caracteres no ASCII para los identificadores. Incluso si funcionan correctamente, las personas que usan una distribución de teclado diferente te maldecirán por hacer que escriban estos caracteres.

Si no puede evitar los personajes que no son ASCII, UTF-8 es su mejor opción. A diferencia de UTF-16 y UTF-32, es un superconjunto de ASCII, lo que significa que cualquiera que lo abra con la codificación incorrecta obtiene al menos la mayor parte correcta; y, a diferencia de las páginas de códigos de 8 bits, puede codificar sobre todos los caracteres que necesitará, sin ambigüedades, y está disponible en todos los sistemas, independientemente de la configuración regional.

Y luego tienes la codificación que procesa tu código; Esto no tiene que ser lo mismo que la codificación de su archivo fuente. Por ejemplo, puedo escribir PHP fácilmente en UTF-8, pero establecer su codificación interna de multibyte en, por ejemplo, Latin-1; debido a que el analizador PHP no se preocupa en absoluto por las codificaciones, sino que solo lee secuencias de bytes, mis literales de cadena UTF-8 serán malinterpretados como Latin-1. Si saco estas cadenas en un terminal UTF-8, no verá ninguna diferencia, pero las longitudes de cadena y otras operaciones multibyte (por ejemplo substr) producirán resultados incorrectos.

Mi regla de oro es usar UTF-8 para todo; solo si tiene que lidiar con otras codificaciones, convierta a UTF-8 lo antes posible y de UTF-8 lo más tarde posible.


6

La mayoría de los IDE se guardarán de manera predeterminada con la codificación UTF-8, y es casi seguro que elija UTF-8 en lugar de ASCII cuando tenga la opción. Esto asegurará que no tenga problemas extraños con el código de internacionalización.


2
Estás haciendo que parezca que ASCII vs. UTF-8 es una opción. Cuando hay caracteres no ASCII en un archivo, no lo es. Cuando solo hay caracteres ASCII, UTF-8 es ASCII.
Fred Foo

Desearía que Eclipse se adhiriera a esto. Como estudiante de primer año de CS-ish, mi dios ha sido la causa de muchos dolores de cabeza al trabajar en grupos, donde hay presencia de usuarios de OS X, Windows y Linux. (Como referencia el valor predeterminado es MacRoman en OS X, CP-1252 en Windows y se me olvidó cuál en Linux, pero apuesto a que su otro diferente.)
leflings

@leflings: probablemente una codificación de entorno predeterminada que actualmente suele ser UTF-8.
Maciej Piechotka

1

Es muy bueno poder escribir texto sin formato en cadenas o caracteres entre comillas en el código fuente y poder ver el carácter real. Por ejemplo, el símbolo pi 'π' o el ideógrafo '𠀊' son mucho mejores que el equivalente '\ u3c0' para pi y L '\ u2000A' para el ideógrafo.

Es posible escribir y / o copiar y pegar estos caracteres directamente en el código fuente, tal como lo haría con los caracteres ASCII, en un editor decente.

Encuentro ejemplos concretos útiles para conceptualizar y comprender cosas que las descripciones de palabras a veces no parecen conducir a casa. Conceptualice las constantes de caracteres Unicode escritas en el código fuente, como el siguiente breve fragmento de código de ejemplo:

const unsigned char  ASCII_0X7E      = (unsigned char)  '~';
const unsigned short UNICODE_0X3C0   = (unsigned short) 'π';
const unsigned long  UNICODE_0X2000A = (unsigned long)  '𠀊';
const unsigned long  UNICODE_0X2893D = (unsigned long)  '𨤽';

El carácter de tilde ASCII '~' se puede guardar en un archivo fuente ASCII o UTF-8, pero los caracteres Unicode no se pueden almacenar en formato ASCII. El símbolo PI 'π' es el punto de código Unicode 0x3c0 y se puede almacenar en forma UTF-8 como un valor de dos bytes 0xcf, 0x80. Los ideogramas en los puntos de código Unicode 0x2000a y 0x2893d requieren secuencias UTF-8 de 4 bytes.

Para que esos caracteres conserven sus valores deseados y el compilador los interprete como se esperaba, el código fuente debe guardarse en un formato que admita el conjunto de caracteres Unicode, como UTF-8 o UTF-16. Si se guarda como UTF-8, un compilador decente comprenderá e interpretará los valores según lo previsto y un editor decente cargará y mostrará los caracteres correctamente.

Como otros han estado señalando, si simplemente no tiene ningún carácter en su código fuente que esté fuera del rango ASCII, guardar como UTF-8 dará como resultado un archivo que no es diferente de guardar un archivo ASCII, ya que UTF- 8 está diseñado para superponer ASCII en el rango de caracteres ASCII. Tan pronto como escriba cualquier carácter en su código fuente que esté fuera del rango ASCII, un editor decente le informará que debe elegir una codificación para guardar el archivo. UTF-8 es una buena opción ya que puede manejar ASCII tal cual y prácticamente cualquier otro personaje compatible con su entorno de desarrollo.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.