2009-12-22 16 views
20

Cuando uso el intérprete scala (es decir, ejecutando el comando 'scala' en la línea de comandos), no puedo imprimir caracteres Unicode correctamente. Por supuesto, a-z, A-Z, etc. se imprimen correctamente, pero por ejemplo € o ƒ se imprimen como?.Imprimir Unicode desde el intérprete de Scala

print(8364.toChar) 

resultados? en lugar de €. Probablemente estoy haciendo algo mal. Mi terminal admite caracteres utf-8 e incluso cuando canalizo la salida a un archivo separado y lo abro en un texteditor,? se visualiza.

Todo esto sucede en Mac OS X (Snow Leopard, 10.6.2) con Scala 2.8 (nightly build) y Java 1.6.0_17)

+0

¿En qué sistema operativo está ejecutando el intérprete? ¿Y qué versión de Scala? –

+0

Agregado en mi publicación original –

Respuesta

16

he encontrado la causa del problema y una solución para que funcione como debería. Como ya sospechaba después de publicar mi pregunta y leer la respuesta de Calum y problemas con la codificación en la Mac con otro proyecto (que estaba en Java), la causa del problema es la codificación predeterminada utilizada por Mac OS X. Cuando comienza scala intérprete, usará la codificación predeterminada para la plataforma especificada. En Mac OS X, esta es Macroman, en Windows probablemente sea CP1252. Puede comprobar esto escribiendo el siguiente comando en el intérprete Scala:

scala> System.getProperty("file.encoding"); 
res3: java.lang.String = MacRoman 

De acuerdo con la prueba ayuda scala, es posible proporcionar propiedades de Java utilizando la opción -D. Sin embargo, esto no funciona para mí. Terminé establecer la variable de entorno

JAVA_OPTS="-Dfile.encoding=UTF-8" 

Después de ejecutar scala, el resultado de la orden anterior dará el siguiente resultado:

scala> System.getProperty("file.encoding") 
res0: java.lang.String = UTF-8 

Ahora, la impresión de caracteres especiales funciona como se esperaba:

print(0x20AC.toChar)    
€ 

Por lo tanto, no es un error en Scala, sino un problema con las codificaciones predeterminadas. En mi opinión, sería mejor si se usara UTF-8 por defecto en todas las plataformas. En mi búsqueda de una respuesta si esto se considera, encontré un discussion en la lista de correo de Scala sobre este tema.En el primer mensaje, se propone utilizar UTF-8 de forma predeterminada en Mac OS X cuando file.encoding informa Macroman, ya que UTF-8 es el juego de caracteres predeterminado en Mac OS X (me pregunto por qué file.encoding por defecto está configurado en Macroman, probablemente esto es una herencia de Mac OS antes de que se lanzara el 10?). No creo que esta propuesta forme parte de Scala 2.8, ya que Martin Odersky wrote es probablemente mejor mantener las cosas como están en Java (es decir, respetar la propiedad file.encoding).

+0

Para citar Sun: _La especificación de la plataforma J2SE no exige la propiedad "file.encoding"; es un detalle interno de las implementaciones de Sun y no debe ser examinado o modificado por el código de usuario. También está destinado a ser de solo lectura; es técnicamente imposible admitir la configuración de esta propiedad a valores arbitrarios en la línea de comandos o en cualquier otro momento durante la ejecución del programa. http://bugs.sun.com/view_bug.do?bug_id=4163515 Por lo tanto, no es compatible, puede no funcionar en todas las JVM y puede tener efectos secundarios no deseados. – McDowell

+1

Una forma de evitar esto es que McDowell defina System.out PrintStream (que aún funciona como OutputStream sin formato) con PrintStream que utiliza la codificación que desea, y luego use eso, como "val myOut = nuevo PrintStream (System.out, "UTF-8"); myOut.print (0x20AC.toChar) ". Esto siempre debería funcionar. Editaría esto pero no creo que tenga el karma para ese tipo de cosas. – Calum

+1

@Calum: se interesante para ver si funciona en Mac; no funciona muy bien en Windows, pero puede tratarse de un problema específico de la plataforma: http://illegalargumentexception.blogspot.com/2009/04/i18n-unicode-at-windows-command-prompt.html#charsets_javaconsole – McDowell

3

Ok, al menos en parte, si no todos, de su problema aquí está que 128 no es el punto de código Unicode para Euro. 128 (o 0x80 ya que el hexágono parece ser la norma) es U+0080 <control>, es decir, no es un carácter imprimible, por lo que no es sorprendente que su terminal tenga problemas para imprimirlo.

punto de código del Euro es 0x20AC (o en decimal 8364), y que parece funcionar para mí (estoy en Linux, en una noche de 2,8):

scala> print(0x20AC.toChar) 
€ 

Otra prueba de la diversión es para imprimir el muñeco de nieve de caracteres Unicode:

scala> print(0x2603.toChar) 
☃ 

128 € que es aparentemente un carácter extendido de una de las páginas de códigos de Windows.

que tiene el otro personaje que ha mencionado que trabajar demasiado:

scala> 'ƒ'.toInt 
res8: Int = 402 

scala> 402.toChar 
res9: Char = ƒ 
+0

Tiene razón con respecto al número equivocado para el símbolo Euroo. Sin embargo, todavía no funciona para mí: scala> print (0x20AC.toChar) ? Pero si funciona en las noches, es probable que sea un problema con mi sistema o tal vez se solucione en versiones más nuevas de Scala 2.8. Actualizaré una investigación más a fondo. –

+0

Comprobé esto en las noches de hoy (2.8.0.r20300-b20091223020158) y 'print (0x20AC.toChar)' imprime un questionmark como todas las otras 2.8 versiones que tengo por ahí. – p3t0r

+0

Estoy en OSX 10.6.2 por cierto. – p3t0r

0

para Windows en la línea de comandos (cmd) de impresión:

  1. set JAVA_OPTS="-Dfile.encoding=UTF-8"
  2. chcp 65001

artículo 2 significa UTF-8

Si no desea imprimir cada vez " chcp 65001 ", puede cambiar/agregar valor en el Registro de Windows de esta manera:

  1. comando Ejecutar regedit
  2. registro hallazgo [Procesador HKEY_CURRENT_USER \ Software \ Microsoft \ Command]
  3. Nueva => Valor de cadena
  4. Name = "AutoRun", datos = "65001 chcp" (sin comillas)

(ver https://superuser.com/a/482117/454417)

uso Windows 10 y Scala 2.11.8

Cuestiones relacionadas