2010-06-08 20 views
17
funzione

Windows _setmbcp consente a qualsiasi pagina di codice valido ...Perché non è consentito UTF-8 come tabella codici "ANSI"?

(tranne UTF-7 e UTF-8, che non sono supportati )

OK, che non supportano UTF-7 marche senso: i personaggi hanno rappresentazioni non univoche e questo introduce rischi di complessità e sicurezza.

Ma perché non UTF-8?

A quanto ho capito, le versioni "ANSI" delle funzioni API di Windows convertono i loro argomenti in UTF-16, richiamano l'equivalente funzione "W" e convertono qualsiasi stringa nell'output in "ANSI". Questo è quello che ho fatto manualmente. Quindi, perché Windows non può farlo per me?

+3

Sapevate che CP65001 è il nome di Windows per UTF-8? Non è ben documentato, ma puoi usarlo in un numero sorprendente di posti, anche se ci sono alcuni bug, ad esempio in 'WriteFile()'. – hippietrail

risposta

9

La codepage "ANSI" è fondamentalmente legacy: Windows 9X era. Tutto il software moderno dovrebbe essere in ogni caso Unicode (ovvero UTF-16). Fondamentalmente, quando la roba della pagina di codice Ansi era stata originariamente progettata, l'UTF-8 non era nemmeno stato inventato e quindi il supporto per le codifiche multi-byte era piuttosto casuale (cioè la maggior parte delle pagine di codice Ansi sono a byte singolo, con l'eccezione di alcune Pagine di codice dell'Asia orientale che sono uno o due byte). L'aggiunta di supporto per codifiche multi-byte "appropriate" probabilmente non è stata giudicata utile quando tutti i nuovi sviluppi dovrebbero essere eseguiti in UTF-16.

+15

Sono d'accordo che tutto il nuovo sviluppo dovrebbe essere in * Unicode *. Ma avevo dei motivi per proporre l'uso di UTF-8 invece di UTF-16. (1) Il mio team ha scritto un milione di righe di codice non Unicode prima che qualcuno se ne fregasse, e ora sarebbe un enorme sforzo cambiare tutte quelle stringhe basate su char in quelle basate su wchar_t. (2) Abbiamo in programma di trasferire il nostro prodotto su Linux, sul quale tende a preferire UTF-8. – dan04

5

_setmbcp() è una funzione VC++ RTL, non una funzione API Win32. Riguarda solo il modo in cui RTL interpreta le stringhe. Non ha alcun effetto sulle funzioni Win32 API A. Quando chiamano internamente le loro controparti W, le funzioni A utilizzano sempre MultiByteToWideChar() e WideCharToMultiByte() specificando la tabella codici 0 (CP_ACP) per utilizzare la tabella codici Ansi predefinita del sistema per le conversioni.

+0

Microsoft lo dichiara dovunque in modo esplicito? Se effettivamente lo fanno, non vedo alcun motivo per cui non dovrebbe esserci un modo per dire in qualche modo al runtime di usare CP_UTF8 quando si usa la funzione ANSI. – Calmarius

3

Michael Kaplan, un esperto di internazionalizzazione di Microsoft, ha cercato di rispondere a questo on his blog. Fondamentalmente la sua spiegazione è che anche se le versioni "ANSI" delle funzioni dell'API di Windows hanno lo scopo di gestire diverse code page, storicamente c'era un'implicita aspettativa che le codifiche dei caratteri richiedessero al massimo due byte per punto di codice. UTF-8 non soddisfa questa aspettativa, e cambiando tutte queste funzioni ora richiederebbe una grande quantità di test.

+0

Le code page ANSI non sono limitate a due byte in Windows. La progressione di char era SBCS-> DBCS-> MBCS e per wchar_t era UCS2-> UTF16. Non vedo buone ragioni per cui MBCS non funzioni con una codepage UTF8 e con char. – evoskuil

+0

@evoskuil Che cos'è un esempio di una tabella codici ANSI supportata da Windows che utilizza più di due byte per punto di codice? AFAIK, per Windows, MBCS significa DBCS (e DBCS significa caratteri a 1 o 2 byte) e http://msdn.microsoft.com/en-us/library/cwe8bzh0.aspx a quanto pare lo conferma. – jamesdlin

+1

vedere [Identificatori pagina codice] (http: // msdn.microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).asp) Ho postato sopra: Windows XP e versioni successive: GB18030 Cinese semplificato (4 byte) Il riferimento che hai postato dichiara : "Supporto per una forma di set di caratteri multibyte (MBCS) chiamato set di caratteri a doppio byte (DBCS) su tutte le piattaforme." IOW il modulo chiamato DBCS è un sottoinsieme di MBCS. Questo è per "tutte le piattaforme". Vedere più in basso nella pagina: "Quando si esegue una versione abilitata per MBCS del sistema operativo Windows [gli strumenti sono] completamente abilitati per MBCS." – evoskuil

Problemi correlati