2009-09-10 20 views
13

En mi aplicación Java se me ha pasado en una cadena que tiene este aspecto:Imprimir cadena Unicode literal como el carácter real

"\ u00a5123"

Al imprimir esa cadena en la consola, consigo el misma cadena que la salida (como se esperaba).

Sin embargo, quiero imprimir eso convirtiendo el Unicode en el símbolo real de yen (\ u00a5 -> símbolo de yen) - ¿cómo voy a hacer esto?

es decir, lo que se ve así: "[símbolo de yenes] 123"

+0

Entonces, para tener una mejor idea del espacio problemático, ¿no hay forma de obtener una cadena Unicode adecuada? ¿En qué contexto se usa esto? ¿El tiempo/velocidad es una consideración importante? – aperkins

+0

Además, ¿hay alguna suposición simplificadora? es decir, ¿es este el único momento en que ocurrirá "\ u ####"? Porque entonces podrías usar una expresión regular para sacar el número. – aperkins

+0

posible duplicado de [Cómo descomprimir un literal de cadena de Java en Java] (http://stackoverflow.com/questions/3537706/howto-unescape-a-java-string-literal-in-java) –

Respuesta

15

me escribió un pequeño programa:

public static void main(String[] args) { 
    System.out.println("\u00a5123"); 
} 

Es de salida:

¥ 123

es decir, muestra exactamente lo que indicó en su publicación. No estoy seguro de que no esté sucediendo algo más. ¿Qué versión de Java estás usando?

edición:

En respuesta a su aclaración, hay un par de diferentes técnicas. Lo más sencillo es buscar un "\ u" seguido de 4 caracteres de código hexadecimal, extraer esa pieza y reemplazarla por una versión unicode con el código hexadecimal (utilizando la clase de caracteres). Por supuesto, esto supone que la cadena no tendrá una \ u al frente.

No conozco ningún sistema en particular para analizar la Cadena como si fuera una Cadena Java codificada.

+0

Tiene razón al decir que imprimir la cadena directamente le dará el resultado correcto. Sin embargo, alguien me ha pasado una cadena esencialmente escapada. Así que supongamos que su método principal aún existe, pero llamó a un método llamado foo de la siguiente manera: foo ("\\ u00a5123"); <- note el escape de la cadena - entonces esencialmente el parámetro que obtengo dentro del método foo es la cadena con la que trato – digiarnie

+0

El escape de barra invertida es algo que solo el compilador de Java necesita, no la JVM o la API. Por lo tanto, no es sorprendente encontrar que no hay una manera fácil de analizar tales cadenas en tiempo de ejecución. –

+0

@Todd estuvo de acuerdo, sobre la única otra cosa en la que he podido pensar es intentar usar el compilador de alguna manera, pero eso me parece un problema. – aperkins

1

Probablemente tenga que escribir un análisis para estos, a menos que pueda encontrar uno en una biblioteca de terceros. No hay nada en el JDK que pueda analizarlos por usted, lo sé porque hace poco tuve la idea de usar este tipo de escapes como una forma de pasar de contrabando unicode a través de una base de datos Latin-1-only. (Terminé haciendo algo más por cierto)

Le diré que java.util.Properties escapa y quita el espacio de los caracteres Unicode de esta manera al leer y escribir archivos (ya que los archivos deben ser ASCII). Los métodos que utiliza para esto son privados, por lo que no puede llamarlos, pero puede usar el código fuente JDK para inspirar su solución.

+0

Un poco intrincado, pero probablemente podría emitir la cadena como un valor a un archivo de propiedades en memoria y luego leerlo usando la clase 'Propiedades'. – McDowell

2

Como se ha mencionado anteriormente, estas cadenas tendrán que analizarse para obtener el resultado deseado.

  1. Tokenizar la cadena utilizando \ u como separador. Por ejemplo: \u63A5\u53D7 => { "63A5", "53D7" }

  2. Proceso de estas cadenas de la siguiente manera:

    String hex = "63A5"; 
    int intValue = Integer.parseInt(hex, 16); 
    System.out.println((char)intValue); 
    
0

podría sustituir a los anteriores con esto:

System.out.println((char)0x63A5); 

Este es el código para imprimir todo el edificio de la caja caracteres Unicode.

public static void printBox() 
{ 
    for (int i=0x2500;i<=0x257F;i++) 
    { 
     System.out.printf("0x%x : %c\n",i,(char)i); 
    } 
} 
Cuestiones relacionadas