In realtà, il set di caratteri utilizzato da tasklist
è sempre diverso dal valore predefinito di sistema.
D'altra parte, è abbastanza sicuro utilizzare l'impostazione predefinita finché l'output è limitato a ASCII. Solitamente i moduli eseguibili hanno solo caratteri ASCII nei loro nomi.
Quindi, per ottenere le stringhe corrette, è necessario convertire (codice ANSI) la tabella codici di Windows nella tabella codici OEM e passare quest'ultima come set di caratteri a InputStreamReader
.
Sembra che non ci sia una mappatura completa tra queste codifiche. La seguente mappatura può essere utilizzato:
Map<String, String> ansi2oem = new HashMap<String, String>();
ansi2oem.put("windows-1250", "IBM852");
ansi2oem.put("windows-1251", "IBM866");
ansi2oem.put("windows-1252", "IBM850");
ansi2oem.put("windows-1253", "IBM869");
Charset charset = Charset.defaultCharset();
String streamCharset = ansi2oem.get(charset.name());
if (streamCharset) {
streamCharset = charset.name();
}
InputStreamReader isr = new InputStreamReader(p.getInputStream(),
streamCharset);
Questo approccio ha funzionato per me con windows-1251
e IBM866
coppia.
Per ottenere la codifica OEM corrente utilizzata da Windows, è possibile utilizzare la funzione GetOEMCP
.Il valore di ritorno dipende Lingua per programmi non Unicode impostazione sul amministrativa scheda in Regione e pannello di controllo Lingua. Il riavvio è richiesto per applicare la modifica.
Ci sono due tipi di codifiche su Windows: ANSI e OEM.
Il primo è utilizzato da applicazioni non Unicode in esecuzione in modalità GUI.
Quest'ultimo è utilizzato dalle applicazioni della console. Le applicazioni della console non possono visualizzare caratteri che non possono essere rappresentati nella codifica OEM corrente.
Poiché tasklist
è l'applicazione in modalità console, il suo output è sempre nell'attuale codifica OEM.
Per i sistemi inglesi, la coppia è in genere Windows-1252 e CP850.
Dato che sono in Russia, il mio sistema ha le seguenti codifiche: Windows-1251 e CP866.
Se mi cattura di uscita del tasklist
in un file, il file non può visualizzare caratteri cirillici correttamente:
ricevo ЏаЁўҐв
invece di Привет
se visti in Blocco note (Hi!).
E µTorrent
viene visualizzato come зTorrent
.
Non è possibile modificare la codifica utilizzata da tasklist
.
Tuttavia è possibile modificare la codifica di uscita cmd
. Se passi lo switch /u
, verrà visualizzato tutto nella codifica UTF-16.
cmd /c echo Hi>echo.txt
Le dimensioni echo.txt
è 4 byte: due byte per Hi
e due byte per nuova linea (\r
e \n
).
cmd /u /c echo Hi>echo.txt
Ora la dimensione del echo.txt
è 8 byte: ogni carattere è rappresentato con due byte.
C'è una domanda qui? Hai provato e vedi? –
@JimGarrison Ho ricevuto un avviso da FindBugs su * "affidamento sulla codifica predefinita" * in InputStreamReader e non ho idea se questo potrebbe causare un problema o meno. Così ho cercato e trovato il secondo post che sembra dire che potrebbe. Questo è quello che voglio controllare. Sulla mia macchina quel codice funziona bene. – assylias
Aggiungerò questo come commento piuttosto che come una domanda perché la mia incertezza è abbastanza grande. Detto questo, penserei che il set di caratteri usato da un'utilità di sistema come quella sarebbe quello delle impostazioni internazionali predefinite per l'installazione del sistema operativo. Interrogare per quella locale e usarlo per interpretare il flusso di output sembra essere l'approccio più generale. Ma se sono presenti anche delle localizzazioni, è necessario invertire la progettazione dei campi che potrebbero cambiare in modo da analizzarli. E tutto dipende dal fatto che l'utilità in questione sia stata scritta per variare in questo modo in primo luogo. – eh9