2012-02-16 9 views
17

Algunos códigos heredados se basan en el juego de caracteres predeterminado de la plataforma para las traducciones. Para las instalaciones de Windows y Linux en el "mundo occidental" sé lo que eso significa. Pero pensando en plataformas rusas o asiáticas, no estoy seguro del juego de caracteres predeterminado de su plataforma (¿solo UTF-16?).Java: juego de caracteres predeterminado de la plataforma en diferentes plataformas?

Por lo tanto me gustaría saber lo que me gustaría tener al ejecutar la siguiente línea de código:

System.out.println("Default Charset=" + Charset.defaultCharset()); 

Editar: no quiero discutir los problemas de los juegos de caracteres y su diferencia a unicode aquí . Solo quiero recopilar qué sistemas operativos darán como resultado un juego de caracteres específico. Por favor publique solo valores concretos!

Respuesta

21

Esa es una configuración específica de usuario. En muchos sistemas Linux modernos, es UTF-8. En Mac, es MacRoman. En los Estados Unidos en Windows, a menudo es CP1250, en Europa es CP1252. En China, a menudo encuentras chino simplificado (Big5 o un GB *).

Pero ese es el defecto del sistema, que cada usuario puede cambiar en cualquier momento. Que es probablemente la solución: Establecimiento de la codificación cuando se inicia su aplicación utilizando la propiedad del sistema file.encoding

See this answer cómo hacerlo. Sugiero poner esto en una pequeña secuencia de comandos que inicia su aplicación, por lo que el usuario predeterminado no está contaminado.

+0

Es cierto conjunto de caracteres por defecto del sistema se puede cambiar por un usuario - pero ¿cuántos no desarrolladores lo hace? – Robert

+1

¿Qué hay de las personas en una red corporativa que llevan su inicio de sesión global con ellos? Todo lo que digo es: nunca esperes ningún valor útil allí. En su código, siempre debe especificar la codificación de los datos a medida que los lee.Si eso no funciona, entonces debe establecer 'file.encoding' o cosas ** ** romperán :-) –

+1

@Aaron Digulla: En los casos en que los datos son suministrados por los usuarios y vienen sin metadatos de codificación, la plataforma predeterminada la codificación podría ser tu mejor opción. –

6

Para instalaciones de Windows y Linux en el "mundo occidental" Yo sé lo que eso significa.

Probablemente no es tan bueno como crees.

Pero pensar en plataformas rusos o asiáticos estoy totalmente seguro de qué juego de caracteres por defecto de su plataforma es

por lo general es lo que se utiliza la codificación históricamente en su país.

(solo UTF-16?).

no

más definitivamente. El uso de la computadora se extendió ampliamente antes de que existiera el estándar Unicode, y cada área de lenguaje desarrolló una o más codificaciones que podrían soportar su lenguaje. Aquellos que necesitaban menos de 128 caracteres fuera de ASCII normalmente desarrollaban un "ASCII extendido", muchos de los cuales se estandarizaron con el tiempo como ISO-8859, mientras que otros desarrollaron codificaciones de dos bytes, a menudo varios compitiendo. Por ejemplo, en Japón, mensajes de correo electrónico suelen utilizar JIS, pero las páginas web utilizan Shift-JIS, y algunas aplicaciones utilizan EUC-JP. Cualquiera de estos podría encontrarse como la codificación predeterminada de la plataforma en Java.

que todo es un lío enorme, que es exactamente por qué Unicode fue desarrollado. Pero el desorden no ha desaparecido todavía y todavía tenemos que lidiar con él y no deberíamos hacer suposiciones sobre qué codificación se encuentra en un grupo dado de bytes para interpretar como texto. There Ain't No Such Thing as Plain Text.

+0

Michael, eres tan súper correcto que me hace llorar. Es un desastre que incluso haya contemplado el parche de mono en las bibliotecas estándar para prohibir la 'codificación predeterminada'. Tengo terabytes corpora que han sido unfijably mutilados por este problema. Este es el problema aquí, no Java, lo que puede resolverlo. No sé cómo solucionarlo sistémicamente, porque ser compatible con los errores desde el principio hasta el final parece ser el * modus operandi * de Java. No sé cómo arreglar defectos de diseño. – tchrist

+0

Lo que pasa es que no puedes "no hacer suposiciones". Los usuarios * escribirán * archivos de texto sin indicación de codificación. Los sistemas heredados * * almacenarán cadenas con codificación desconocida. – plugwash

Cuestiones relacionadas