2010-01-28 7 views

Respuesta

3

Documentación de LogManager.readConfiguration() dice que acepta datos en formato java.util.Properties. Por lo tanto, la realidad correcta aplicación de codificación de seguridad es la siguiente:

String s = ...; 

StringBuilder propertiesEncoded = new StringBuilder(); 
for (int i = 0; i < s.length(); i++) 
{ 
    char c = s.charAt(i); 
    if (c <= 0x7e) propertiesEncoded.append((char) c); 
    else propertiesEncoded.append(String.format("\\u%04x", (int) c)); 
} 
ByteArrayInputStream in = new ByteArrayInputStream(propertiesEncoded.toString().getBytes("ISO-8859-1")); 

EDIT: algoritmo de codificación corregido

Edit2: En realidad, java.util.Properties formato tiene algunas otras restricciones (como escapar de \ y otra caracteres especiales), vea los documentos

EDIT3: 0x00-0x1f escapando eliminado, como Alan Moore sugiere

+0

Buena captura en codificación Unicode específica para el formato de archivo de propiedades. Creo que esto es correcto siempre que 's' sea UTF-8. –

+0

@Kaleb: 's' solo será una Cadena, en la misma codificación que siempre usa Strings, no necesita preocuparse por eso. Solo tiene que saber la codificación * target *, que es 'ISO-8859-1' como dijo @axtavt. –

+0

@axtavt: su código saldrá de Unicode de todos los caracteres TAB, avance de línea, avance de carro y devolución de carro, lo cual no es correcto. Esos solo necesitan ser escapados si son parte de una clave o elemento de Propiedades, y eso ya debería haberse solucionado cuando se llame a este método. –

4

Ver java.io.ByteArrayInputStream

String s = "test"; 
InputStream input = new ByteArrayInputStream(s.getBytes("UTF8")); 
+0

Esto no funcionará. 'readConfiguration()' pasa la secuencia a 'Properties # load (InputStream)', y ese método espera que la transmisión sea 'ISO-8859-1', no' UTF-8'. –

+2

Luego puede pasar la codificación ISO-8859-1 a getBytes() – Kevin

7

Utilice la ByteArrayInputStream, y tenga cuidado al especificar una codificación de caracteres apropiado. p.ej.

ByteArrayInputStream(str.getBytes("UTF8")); 

Debe preocuparse por la codificación de caracteres para determinar cómo cada carácter se convierte en un conjunto de bytes. Nota Puede utilizar el método predeterminado getBytes() y especificar la codificación de la JVM se ejecuta a través de la -Dfile.encoding=...

+0

Esto no funcionará. 'readConfiguration()' pasa la secuencia a 'Properties # load (InputStream)', y ese método espera que la transmisión sea 'ISO-8859-1', no' UTF-8'. –