2010-06-08 2 views
17

Der Windows _setmbcp Funktion ermöglicht es jede gültige Code Seite ...Warum ist UTF-8 nicht als "ANSI" -Codepage zulässig?

(außer UTF-7 und UTF-8, die nicht unterstützt)

OK, nicht unterstützt UTF-7 Marken Sinn: Zeichen haben nicht eindeutige Darstellungen und führen zu Komplexität und Sicherheitsrisiken.

Aber warum nicht UTF-8?

Wie ich es verstehe, die "ANSI" Versionen der Windows-API-Funktionen konvertieren ihre Argumente in UTF-16, rufen Sie die entsprechende "W" -Funktion, und konvertieren Sie alle Zeichenfolgen in der Ausgabe in "ANSI". Das habe ich manuell gemacht. Warum kann Windows das nicht für mich tun?

+3

Wussten Sie, dass CP65001 Windows-Name für UTF-8 ist? Es ist nicht gut dokumentiert, aber Sie können es in einer überraschenden Anzahl von Orten verwenden, obwohl es einige Fehler zum Beispiel in 'WriteFile()' gibt. – hippietrail

Antwort

9

Die "ANSI" Codepage ist im Grunde veraltet: Windows 9X Ära. Alle moderne Software sollte trotzdem Unicode (dh UTF-16) sein.

Grundsätzlich wurde UTF-8 nicht erfunden, als das Ansi-Codepage-Zeug ursprünglich entwickelt wurde, und daher war die Unterstützung für Multi-Byte-Codierungen ziemlich willkürlich (dh die meisten Ansi-Codepages sind Einzelbyte, mit Ausnahme von einigen Ostasiatische Codepages, die ein oder zwei Byte sind). Das Hinzufügen von Unterstützung für "richtige" Multi-Byte-Codierungen wurde wahrscheinlich als nicht lohnend erachtet, wenn alle neuen Entwicklungen in UTF-16 sowieso durchgeführt werden sollten.

+15

Ich stimme zu, dass alle neuen Entwicklungen in * Unicode * sein sollten. Aber ich hatte Gründe, UTF-8 anstelle von UTF-16 zu verwenden. (1) Mein Team hat eine Million Zeilen nicht-Unicode-fähigen Code geschrieben, bevor irgendjemand darüber nachgedacht hat, und jetzt wäre es ein enormer Aufwand, all diese zeichenbasierten Strings in wchar_t-basierte Strings zu ändern. (2) Wir planen, unser Produkt auf Linux zu portieren, auf dem UTF-8 tendenziell bevorzugt wird. – dan04

5

_setmbcp() ist eine VC++ RTL-Funktion, keine Win32-API-Funktion. Es beeinflusst nur, wie die RTL Zeichenfolgen interpretiert. Es hat keinerlei Auswirkungen auf Win32 API A Funktionen. Wenn sie ihre Gegenstücke W intern aufrufen, verwenden die A-Funktionen immer MultiByteToWideChar() und WideCharToMultiByte(), die Codepage 0 (CP_ACP) angeben, um die systemstandardmäßige Ansi-Codepage für die Konvertierungen zu verwenden.

+0

Gibt Microsoft das explizit irgendwo an? Wenn sie das tatsächlich tun, dann sehe ich keinen Grund, warum es keine Möglichkeit geben sollte, der Laufzeit irgendwie zu sagen, CP_UTF8 zu verwenden, wenn die ANSI-Funktion verwendet wird. – Calmarius

3

Michael Kaplan, ein Internationalisierungsexperte von Microsoft, versuchte, diese on his blog zu beantworten.

Grundsätzlich ist seine Erklärung, dass, obwohl die "ANSI" -Versionen der Windows-API-Funktionen unterschiedliche Codepages handhaben sollen, implizit erwartet wurde, dass Zeichenkodierungen höchstens zwei Bytes pro Codepunkt benötigen würden. UTF-8 erfüllt diese Erwartung nicht, und eine Änderung all dieser Funktionen würde nun eine große Menge an Tests erfordern.

+0

ANSI-Codepages sind nicht auf zwei Bytes in Windows beschränkt. Der Fortschritt von char war SBCS-> DBCS-> MBCS und für wchar_t war UCS2-> UTF16. Ich sehe keinen guten Grund für MBCS, nicht mit einer UTF8-Codepage und einem char zu arbeiten. – evoskuil

+0

@evoskuil Was ist ein Beispiel für eine ANSI-Codepage, die von Windows unterstützt wird und mehr als zwei Byte pro Codepunkt verwendet? AFAIK, für Windows, MBCS bedeutet DBCS (und DBCS bedeutet 1- oder 2-Byte-Zeichen), und http://msdn.microsoft.com/en-us/library/cwe8bzh0.aspx bestätigt dies offenbar. – jamesdlin

+1

siehe [Codeseitenbezeichner] (http: // msdn.microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).asp) Ich postete oben: Windows XP und später: GB18030 Vereinfachtes Chinesisch (4 Byte) Die Referenz, die Sie veröffentlicht haben, besagt : "Unterstützung für eine Form von Multibyte-Zeichensatz (MBCS) namens Doppelbyte-Zeichensatz (DBCS) auf allen Plattformen." IOW das Formular namens DBCS ist eine Teilmenge von MBCS. Dies ist für "alle Plattformen". Siehe weiter unten auf der Seite: "Wenn auf einer MBCS-fähigen Version des Windows-Betriebssystems ausgeführt werden [Tools sind] vollständig MBCS-fähig." – evoskuil