Si noti che un determinato sistema ha due pagine di codice attive di interesse , come determinato dall'impostazione legacy denominata lingua per i programmi non Unicode , precedentemente noto come locale di sistema (vedere la sezione inferiore per informazioni di base):
- la tabella codici OEM utilizzata dalle applicazioni console legacy ,
- la tabella codici ANSI per l'utilizzo da parte di applicazioni GUI legacy .
Nota: ci sono altre due code page, ma sono usate raramente e quindi non discusse qui: il codice EBCDIC e la code page (pre-OS X) per Mac - vedere i documenti WinAPI .
La tabella codici OEM attiva è facilmente ottenibile tramite chcp
, come mostrato nella risposta utile di Forgotten Semicolon, supponendo che non sia stato esplicitamente modificato nella sessione con chcp <codePageNum>
.
Determinare la tabella codici ANSI attiva non è così semplice, ma PowerShell può aiutare, anche nel determinare il nome e la lingua delle impostazioni internazionali del sistema:
In Windows 8+ / Windows Server 2012+ : utilizzare il Get-WinSystemLocale
cmdlet:
Get-WinSystemLocale | Select-Object Name, DisplayName,
@{ n='OEMCP'; e={ $_.TextInfo.OemCodePage } },
@{ n='ACP'; e={ $_.TextInfo.AnsiCodePage } }
Nota: Si può essere tentati di utilizzare [cultureinfo]::CurrentCulture.TextInfo.ANSICodePage
, per esempio, ma questo non riflette necessariamente il livello di sistema tabella codici ANSI attiva; invece, è la codepage ANSI associata alla locale (cultura) dell'utente corrente , che può essere diversa.
Su un sistema inglese-americano, quanto sopra produce:
Name DisplayName OEMCP ACP
---- ----------- ----- ---
en-US English (United States) 437 1252
OEMCP
è la tabella codici OEM, ACP
la tabella codici ANSI.
Un metodo basato su registro che funziona anche su sistemi meno recenti fino a Windows XP :
# Get the code pages:
Get-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\Nls\CodePage |
Select-Object OEMCP, ACP
Su un sistema inglese-americano, quanto sopra produce:
OEMCP ACP
----- ---
437 1252
Se si desidera anche ottenere il nome [friendly] e il LCID della locale di sistema (si noti che gli LCID sono obsoleti):
[Globalization.CultureInfo]::GetCultureInfo([int] ('0x' + (
Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Nls\Language' Default
).Default)
)
Su un sistema inglese-americano, quanto sopra produce:
LCID Name DisplayName
---- ---- -----------
1033 en-US English (United States)
Informazioni di base :
Le impostazioni internazionali di sistema sono il nome legacy per quella che ora è più descrittivamente chiamata lingua per i programmi non Unicode (vedere la terminologia NLS ) e, come suggeriscono i nomi:
L' impostazione si applica solo ai programmi legacy (programmi che non supportano Unicode).
Si applica a tutto il sistema , indipendentemente dalle impostazioni locali di un determinato utente e per modificarlo sono richiesti privilegi di amministratore.
E 'importante notare che è sia un retaggio ambiente , perché le pagine di codice non si applicano più a programmi che utilizzano Unicode internamente e chiamano le versioni Unicode delle API di Windows.
In particolare, determina le pagine di codice attive , ovvero la codifica dei caratteri utilizzata per impostazione predefinita :
la tabella codici ANSI da utilizzare quando i programmi non Unicode chiamano le versioni non Unicode (ANSI) dell'API di Windows, in particolare la versione ANSI della TextOut
funzione per tradurre le stringhe da e verso Unicode, che determina in particolare il modo in cui le stringhe del programma vengono visualizzate nella GUI .
la tabella codici OEM da rendere attiva per impostazione predefinita nelle finestre della console , come indicato da chcp
.
- La tabella codici attiva di una finestra della console determina la modalità di interpretazione e visualizzazione dell'input e dell'output della tastiera dalle applicazioni della console .
- Si noti che ciò significa che anche l'output delle applicazioni della console Unicode viene tradotto nella tabella codici attiva, il che può comportare la perdita di informazioni; l'uso della pseudo code page
65001
, che rappresenta la codifica UTF-8 di Unicode, è una soluzione, ma che può causare programmi di riga di comando legacy per interpretare erroneamente i dati e persino fallire - vedi questa risposta StackOverflow per i dettagli.
- A differenza della tabella codici ANSI, è possibile modificare la tabella codici [OEM] attiva su richiesta per una determinata finestra della console ; ad esempio, per passare alla pagina di codice OEM
850
, correre chcp 850
in cmd.exe
, e $OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = [text.encoding]::GetEncoding(850)
in PowerShell.
- inoltre, le pagine di codice EBCDIC e Mac utilizzate raramente .
Nonostante la parola locale utilizzata nel termine legacy e la lingua delle parole nel termine corrente:
Gli unici aspetti controllati dall'impostazione sono il set di pagine di codice attive e i caratteri bitmap predefiniti , non anche altri elementi di una locale (che sono controllati dalle impostazioni della locale a livello di utente).
Una determinata tabella codici è generalmente condivisa da molte versioni locali e copre più lingue; ad esempio, la tabella 1252
codici ampiamente utilizzata è utilizzata da molte lingue dell'Europa occidentale, incluso l'inglese.
Tuttavia, quando si modifica l'impostazione tramite il Pannello di controllo, si seleziona l'impostazione tramite una locale specifica.
Per un elenco di tutte le codepage di Windows, vedere https://docs.microsoft.com/en-us/windows/desktop/Intl/code-page-identifiers
chcp
otterrai la tabella codici OEM attiva . Come afferma mklement nella sua risposta, c'è sempre un'altra code page attiva in uso da Windows, la code page ANSI. Per ulteriori informazioni, consultare la risposta di mklement .