
Michael Ströder wrote:
Thomas 'PointedEars' Lahn wrote:
Bernd Nawothnig wrote:
On 2012-04-21, wb wrote:
Laut sys.maxunicode (= 65535) habe ich wohl auch eine UTF-16 build, was genau das heißen mag...
Es ist dann ein UCS-2-Build:
--enable-unicode[=ucs[24]]beinahe Enable Unicode strings (default is ucs2)
ACK, das ergibt Sinn.
Das heißt, dass dann nicht jedes Unicodezeichen intern abgespeichert werden kann, also nicht nur nicht dargestellt werden kann.
Wie kommst Du auf dies schmale Brett?
Ist sys.maxunicode nicht die max. Anzahl der Unicode Code Points?
Es ist "An integer giving the largest supported code point for a Unicode character." [1], was fast auf dasselbe hinausläuft (die max. Anzahl der dann möglichen Codepunkte ist genau 1 mehr, denn U+0000 wird darin eingeschlossen). Das hat aber mit der Zeichencodierung UTF-16 nichts zu tun. Die Bezeichnung "UTF-16 build" ist daher fhcsal. Man könnte es eben höchstens (veraltet) als "UCS-2-Build" bezeichnen, weil UCS-2 eben jene Einschränkungen mit sich brachte, die der Unicode-2.0+-Zeichensatz und UTF-16 nicht mehr haben (AIUI, CMIIW):
So richtig verstehe ich das hier nicht: What is the difference between UCS-2 and UTF-16? http://unicode.org/faq/basic_q.html#14
"[..] Sometimes in the past an implementation has been labeled "UCS-2" to indicate that it does not support supplementary characters and doesn't interpret pairs of surrogate code points as characters. Such an implementation would not handle processing of character properties, code point boundaries, collation, etc. for supplementary characters."
UCS-2 steht für Universal Character Set-2, eine 2-Byte Codierung für einen Zeichensatz gleichen Namens aus ingesamt *genau* 65536 möglichen Zeichen. Das heisst, eine Codesequenz für die Darstellung eines Zeichens besteht aus *genau* *einer* Code-Einheit von 16 Bit Länge (damit lassen sich genau 65536 verschiedene Zustände darstellen). Bevor das Unicode Consortium im Jahr 1996 "The Unicode Standard" 2.0 (mit "surrogate pairs") und darin unter anderem auch die dazugehörige Codierung UTF-16 entwickelte [2a], gab es bereits per ISO/IEC 10646-1:1993 UCS-2 als Standard für die Codierung (mehr oder weniger) aller Zeichen der (inzwischen so genannten) Basic Multilingual Plane (BMP; U+0000 bis U+FFFF [2b]) und nur genau dieser Zeichen. [2c] Mit UTF-16 werden hingegen Zeichen des *erweiterbaren* Unicode 2.0+- Zeichensatzes [3] codiert (ggf. als Kombination von Zeichen mit verschiedenen Codepunkten). Diese Codierung hat gegenüber der für UCS-2 verwendeten den Vorteil, dass auch Zeichen jenseits der BMP (die in Unicode standardisiert sind) dargestellt werden können. Dazu wird eine zweite Code- Einheit – von ebenfalls 16 Bit Länge – vorangestellt, die angibt, dass die erste und nachfolgende zu einer Codesequenz gehören, d. h. *gemeinsam* den Codepunkt für eine solches Zeichen beschreiben. [4] Die Implementierung muss dies aber unterstützen, sonst kommt Zeichensalat heraus. Andere in Unicode 2.0+ definierte Codierungen, wie etwa UTF-8, haben gegenüber UCS-2 und UTF-16 wiederum den Vorteil, dass für die Darstellung von Zeichen mit niedrigeren Codepunkten ggf. nur 1 Code-Einheit, d. h. bei UTF-8 also 8 Bit, erforderlich ist. Die Datei wird bei gleichem Informationsgehalt also tendenziell kleiner. Dies trifft für alle Zeichen zu, die auch mit US-ASCII codiert werden konnten/können (U+0000 bis U+007F). [5] Gleichzeitig kann man aber mit Surrogatcodes (spezielle Ersatzcodes in einer Codesequenz, deren Wert allein einen mit keinem Zeichen belegten Codepunkt und somit auch kein Zeichen beschreibt) aber auch Zeichen jenseits der BMP (ab U+10000) darstellen und ist somit maximal flexibel (entsprechende Schriftarten zur Anzeige von Glyphen jenseits der BMP, wie etwa antike Schriften – Linear B [6], ägyptische Hieroglyphen [7] etc. –, vorausgesetzt). Einen sehr guten Einblick, wie Unicode funktioniert, erhält man mit den Unicode-Tools von Richard Ishida (W3C, Unicode Editorial Committee) [8a], angefangen mit dem Unicode Code Converter [8b]. Beispielsweise lohnt es sich bereits, etwa ein "ä" in "Mixed input" einzugeben, die "Convert"- Schaltfläche zu aktivieren und sich die Darstellung dieses Zeichens in den verschiedenen Codierungen anzusehen. UniView [8c] bietet dann eine grafische Darstellung der Zeichen und einen Überblick über die Bereiche des Zeichensatzes. (Für Letzteres ebenfalls gut geeignet sind auch die Linux- Programme gucharmap [9a] und KCharSelect [9b], wobei ich ersteres bevorzuge.) ______ [1] <http://docs.python.org/library/sys.html#sys.maxunicode> [2a] <http://en.wikipedia.org/wiki/Unicode#Versions> [2b] <http://en.wikipedia.org/wiki/Basic_Multilingual_Plane> [2c] <http://en.wikipedia.org/wiki/UCS-2> [3] <http://www.unicode.org/faq/basic_q.html#1> [4] <http://www.unicode.org/faq/basic_q.html#13> [5] <http://www.unicode.org/faq/utf_bom.html> [6] <http://rishida.net/scripts/uniview/?codepoints=10000> [7] <http://rishida.net/scripts/uniview/?codepoints=13142> [8a] <http://www.rishida.net/> [8b] <http://www.rishida.net/tools/conversion/> [8c] <http://rishida.net/scripts/uniview/> [9a] <https://live.gnome.org/Gucharmap> [9b] <http://utils.kde.org/projects/kcharselect/> -- PointedEars Please do not Cc: me. / Bitte keine Kopien per E-Mail.