2015-07-14 7 views
17

c'è un file chiamato "dd.txt" nel mio disco, il suo contenuto è \u5730\u7406Qual è la differenza tra una stringa nel codice sorgente e una stringa letta da un file?

ora, quando ho eseguito questo programma

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); 
} 

e ho ottenuto risultati diversi

s1:地理 
s2:\u5730\u7406 

puoi dirmi perché? e come posso leggere quel file e ottenere lo stesso risultato come s1 in cinese?

+4

Perché il _compiler_ esegue la sostituzione prima di compilare qualsiasi cosa. –

+4

Nota a margine: fis.available() indica quanti byte possono essere letti senza bloccare. Non ti dice la lunghezza dell'input (file). – haraldK

+0

grazie a tutti .. –

risposta

30

Quando si scrive \u5730 in codice Java, viene interpretato come un singolo carattere unicode (un letterale unicode) dal compilatore. Quando scrivi lo stesso in un file, sono solo 6 caratteri normali (perché non c'è niente che lo interpreti). C'è una ragione per cui non stai scrivendo 地理 direttamente nel file?

Se si desidera leggere il file contenente i letterali Unicode, è necessario analizzare i valori da soli, buttare via lo \u e analizzare il codice unicode da solo. È molto più semplice scrivere semplicemente unicode corretto con una codifica adatta (ad esempio UTF-8) nel file, in primo luogo se si controlla la creazione del file, e in circostanze normali non si dovrebbe mai imbattersi in file contenenti questi caratteri letterali di escape unicode .

+0

sono solo curioso e voglio sapere perché. grazie ! –

+9

@PaulWang se questo ha risposto alla tua domanda, considera [accettandolo] (https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work). Questo non solo ti dà un po 'di rep, ma fa anche altre due cose - 1) indica alla comunità che questa domanda ha avuto risposta e 2) indica ai futuri lettori che hanno risolto il tuo problema. –

6

Nel codice Java, \uxxxx sono interpretati come come valori letterali Unicode, quindi vengono visualizzati come caratteri cinesi. Questo è fatto solo perché al compilatore viene richiesto di farlo.

Per ottenere lo stesso risultato, è necessario fare un po 'di analisi da soli:

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); 
} 

(si noti che questo funziona solo se ogni personaggio è in forma letterale Unicode, ad esempio \uxxxx)

+0

L'ho già capito, grazie! –

+0

ci sono due problemi nei tuoi codici. –

+0

1, la stringa utilizzata per dividere dovrebbe essere "\\\\ u" 2. il primo elemento di tali array di stringhe è vuoto dopo che l'oggetto stringa è stato diviso. –

2

Prova questo:

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); 
} 
+0

grazie, la tua risposta è perfetta! –

+0

nota che questo supporterà solo i caratteri unicode che si adattano al singolo carattere. Per il resto, prova questo: 'sb.append (new String (Character.toChars (Integer.parseInt (m.gruppo (1), 16))))'. [Maggiori dettagli] (https://stackoverflow.com/questions/5585919/creating-unicode-character-from-its-number/16034658#16034658) – eis

+0

@eis ieri, il mio codice funziona anche per le coppie surrogate. – saka1029

Problemi correlati