Java >> Tutorial de Java >  >> Tag >> return

¿Por qué mi cadena devuelve \ufffd\ufffdN a m e

\ufffd es el carácter de reemplazo en Unicode, se usa cuando intenta leer un código que no tiene representación en Unicode. Supongo que está en una plataforma Windows (o al menos el archivo que leyó se creó en Windows). Windows admite muchos formatos para archivos de texto, el más común es Ansi:cada carácter está representado pero su código ansi.

Pero Windows puede usar directamente UTF16, donde cada carácter está representado por su código Unicode como un número entero de 16 bits, con 2 bytes por carácter. Esos archivos usan marcadores especiales (marca de orden de bytes en el dialecto de Windows) para decir:

  • que el archivo está codificado con 2 (o incluso 4) bytes por carácter
  • la codificación es little o big endian

(Referencia:uso de marcas de orden de bytes en MSDN)

Mientras escribe después de los primeros dos caracteres de reemplazo N a m e y no Name , supongo que tiene un archivo de texto codificado en UTF16. El Bloc de notas puede editar esos archivos de forma transparente (sin siquiera decirte el formato real), pero otras herramientas tienen problemas con ellos... El excelente vim puede leer archivos con diferentes codificaciones y convertir entre ellos.

Si desea usar directamente este tipo de archivo en Java, debe usar el conjunto de caracteres UTF-16. Desde JaveSE 7 javadoc en Charset :UTF-16 Formato de transformación UCS de dieciséis bits, orden de bytes identificado por una marca de orden de bytes opcional


Debe especificar la codificación al leer el archivo, en su caso probablemente sea UTF-16.

Reader reader = new InputStreamReader(new FileInputStream(fileName), "UTF-16");
BufferedReader br = new BufferedReader(reader);

Consulte la documentación para obtener más detalles:clase InputStreamReader.


Etiqueta Java