Possiedo un'applicazione Java che riceve dati tramite un socket utilizzando InputStreamReader
. Si segnala "Cp1252" dal suo metodo getEncoding
:Come si specifica un valore di file.encoding Java coerente con la tabella codici di Windows sottostante?
/* java.net. */ Socket Sock = ...;
InputStreamReader is = new InputStreamReader(Sock.getInputStream());
System.out.println("Character encoding = " + is.getEncoding());
// Prints "Character encoding = Cp1252"
che non necessariamente corrisponde a ciò che i rapporti di sistema come la sua pagina di codice. Ad esempio:
C:\>chcp Active code page: 850
L'applicazione può ricevere byte 0x81, che nella tabella codici 850 rappresenta il carattere ü
. Il programma interpreta quel byte con la tabella codici 1252, che non definisce alcun carattere con quel valore, quindi ricevo invece un punto interrogativo.
sono stato in grado di risolvere questo problema per un cliente che ha usato codici 850 con l'aggiunta di un'altra opzione della riga di comando nel file batch che avvia l'applicazione:
java.exe -Dfile.encoding=Cp850 ...
Ma non tutti i miei clienti utilizzano il codice pagina 850, ovviamente. Come posso ottenere Java per utilizzare una tabella codici compatibile con il sistema Windows sottostante? La mia preferenza sarebbe qualcosa che ho potuto solo mettere nel file batch, lasciando il codice Java intatta:
ENC=... java.exe -Dfile.encoding=%ENC% ...
+1. BTW Sul mio sistema Windows 7 la tabella codici attiva è 850, ma Java riporta "Cp1252" come proprietà di sistema "file.encoding". –
I client e il server devono essere configurati con la stessa codifica, qualunque cosa possa essere per un determinato cliente. Un'app non Java invia i dati carattere al server utilizzando la code page locale, il server memorizza i dati e successivamente il server li invia all'app Java. Nessuno memorizza ciò che è la tabella codici, perché fino a quando tutti hanno usato lo stesso, non importa. Il problema è che l'app Java non collabora; utilizza sempre Cp1252. (La soluzione "giusta" è quella di cambiare il protocollo per forzare tutto, ad esempio, su UTF-8, ma una modifica del protocollo interrompe tutte le installazioni esistenti.) –
Sembra che G_A abbia la tua risposta. Un'altra opzione consiste nel fare in modo che l'app non java riporti all'applicazione java quale pensa sia la codifica, quindi utilizzare il costruttore appropriato, come descritto sopra. – Yishai