java - txt - ¿Cuál es la diferencia entre una cadena en el código fuente y una cadena leída de un archivo?
login con archivo txt java (3)
Cuando escribe /u5730
en el código Java, el compilador lo interpreta como un único carácter Unicode (un literal Unicode). Cuando escribes lo mismo en un archivo, solo son 6 caracteres regulares (porque no hay nada que lo interprete). ¿Hay alguna razón por la que no estás escribiendo 地理
directamente en el archivo?
Si desea leer el archivo que contiene los literales de Unicode, deberá analizar los valores usted mismo, descartar /u
y analizar el punto de código de Unicode. En primer lugar, es mucho más fácil escribir unicode adecuado con una codificación adecuada (p. Ej., UTF-8) en el archivo si controla la creación del archivo y, en circunstancias normales, nunca debe encontrar archivos que contengan estos literales Unicode escapados. .
hay un archivo llamado "dd.txt" en mi disco, su contenido es /u5730/u7406
ahora, cuando ejecuto este programa
public static void main(String[] args) throws IOException {
FileInputStream fis=new FileInputStream("d://dd.txt");
ByteArrayOutputStream baos=new ByteArrayOutputStream();
byte[] buffer=new byte[fis.available()];
while ((fis.read(buffer))!=-1) {
baos.write(buffer);
}
String s1="/u5730/u7406";
String s2=baos.toString("utf-8");
System.out.println("s1:"+s1+"/n"+"s2:"+s2);
}
y tengo un resultado diferente
s1:地理
s2:/u5730/u7406
¿Puedes decirme porque? ¿Y cómo puedo leer ese archivo y obtener el mismo resultado que s1 en chino?
En su código Java, los /uxxxx
se interpretan como literales de Unicode, por lo que se muestran como caracteres chinos. Esto solo se hace así porque el compilador tiene instrucciones de hacerlo.
Para obtener el mismo resultado, debes hacer un análisis de ti mismo:
String[] hexCodes = s2.split("////u");
for (String hexCode : hexCodes) {
if (hexCode.length() == 0)
continue;
int intValue = Integer.parseInt(hexCode, 16);
System.out.print((char)intValue);
}
(tenga en cuenta que esto solo funciona si todos los caracteres están en forma literal de Unicode, por ejemplo, /uxxxx
)
Prueba esto:
static final Pattern UNICODE_ESCAPE = Pattern.compile("////u([0-9a-fA-F]{4})");
static String decodeUnicodeEscape(String s) {
StringBuilder sb = new StringBuilder();
int start = 0;
Matcher m = UNICODE_ESCAPE.matcher(s);
while (m.find()) {
sb.append(s.substring(start, m.start()));
sb.append((char)Integer.parseInt(m.group(1), 16));
start = m.end();
}
sb.append(s.substring(start));
return sb.toString();
}
public static void main(String[] args) throws IOException {
// your code ....
String s1="/u5730/u7406";
String s2= decodeUnicodeEscape(baos.toString("utf-8"));
System.out.println("s1:"+s1+"/n"+"s2:"+s2);
}