Hi!
... Auch hier hat man wieder Probleme mit einigen asiatischen Kodierungen, nicht jedoch mit ISO-8859 oder UTF-8, weil ebenfalls alle interessierenden Zeichen nur im Bereich 0x00..0x7f angesiedelt sind.
Verständnisfrage: Enthält UTF-8 die asiatischen Kodierungen?
UTF-8 enthält keine, sondern ist eine Kodierung. Eine für den Zeichensatz Unicode. Unicode listet eine Menge Zeichen auf, unter anderem asiatische. Es gibt auch noch einige andere Zeichensätze und Kodierungen. Der Unterschied zwischen Zeichensatz und Kodierung ist oft nicht deutlich sichtbar, bei Unicode jedoch ist er es. Unicode ist ein Zeichensatz und damit eine sozusagen theoretische Liste. Jedes Zeichen in dieser Liste wird durch einen Codepoint repräsentiert. Ein Codepoint hat eine Nummer, ist aber ansonsten auch ein eher theoretisches Gebilde. Ins Praktische kommt man durch eine Kodierung. Die UTF-Kodierungen sind eine Vorschrift, wie aus den Codepoints eine konkrete Bytefolge wird, mit der das Zeichen nun im Speicher oder einer Datei abgebildet werden kann. Im Gegensatz zu den anderen Zeichensätzen gibt es mit UTF-8/16/32/... mehrere Arten, um vom einem bestimmten Codepoint zu einer konkreten Bytefolge zu kommen. Unicode ist also ein Zeichensatz, der mit den UTFs mehrere Kodierungen kennt. Bei den anderen Zeichensätze war beispielweise aufgrund ihrer Beschränktheit die Notwendigkeit des Codepoint-Zwischenschritts nicht notwendig.
Jedoch ergab sich die Notwendigkeit, im asiatischen Raum mehr als 256 Zeichen abbilden zu müssen, ohne dass man den grundlegenden Ansatz von Unicode gegangen ist, gehen konnte oder wollte. Jedenfalls musste man mehrere Bytes verwenden, um ein Zeichen darstellen zu können.
Wieso zeigst du einen Widerspruch auf?
Es ist kein Widerspruch sondern liegt an der Art, wie die verschiedenen Kodierungen die Zeichen zu Bytes machen. UTF-8 verwendet die Bytes 00..7F für die 127 ASCII-Zeichen - jedes Zeichen hat damit sein eigenes Byte. Die Codepoint oberhalb von 127 werden mit mehreren Bytes dargestellt, die aber ausschließlich im Bereich 80..FF liegen. Wie bereits gesagt, liegen alle von htmlspecialchars() behandelten Zeichen im Bereich 00..7F und sind damit eineindeutig zu Bytes zugeordnet. Anders sieht es bei einigen asiatischen Kodierungen aus, die verwenden die Bytes 00..7F teilweise mehrfach. Beispielsweise steht das Byte 26h in Kombination mit anderen Bytes nicht für das Zeichen &. Das Byte 26h ist also nicht eineindeutig dem & zugeordnet. Es muss mal als solches behandelt werden und mal darf es das nicht, um die Kombination mit den anderen Bytes und damit das repräsentierte Zeichen nicht zu zerstören. In dem Fall ist es wichtig, dass der Rechner weiß, dass XX26 nicht zu XX26616D703B (x&) umgeschrieben werden darf. Deswegen muss für diese Kodierungen mit mehrdeutiger Verwendung der ASCII-Bytes einerseits htmlspecialchars() und htmlentities() gesagt bekommen, gemäß welcher Zeichenkodierung es die ankommende Bytefolge zu interpretieren hat. Andererseits muss auch mysql_real_escape_string() die zu verwendende Kodierung kennen, weswegen in dem Fall kein SET NAMES geht, sondern nur mysql(i)_set_charset(), denn letzteres beeinflusst auch die Client-API und nicht nur den MySQL-Server.
Ich denke, mit UTF-8 bin ich für alle Kodierungen gewappnet?
Du solltest dir ein grundlegendes Verständnis über die Begriffe aneignen.
Und - ist es richtig, dass chinesisch den umfangreichsten Zeichensatz hat? Also wenn Programme und Datenbank mit chinesisch umgehen können, klappen auch die anderen?
Beide Fragen sind mit einem Nein zu beantworten. Es ist zwar so, dass die Chinesen eine ganze Menge Zeichen erfunden haben. Allerdings haben die Japaner ebenfalls diese Zeichen übernommen und dazu noch weitere (einfachere) Zeichen erfunden. Somit dürften die Japaner mehr Zeichen kennen als die Chinesen. Andererseits gab es in der Volksrepublik China im vorigen Jahrhundert eine Bestrebung, die teilweise aus sehr vielen Strichen bestehenden Zeichen zu vereinfachen. Somit sind eine Menge chinesische Zeichen in der traditionellen und der vereinfachten Variante verfügbar. Die Japaner blieben bei ihrem Gemisch aus traditionellen chinesischen Zeichen und den eigenen. Taiwan, Hong-Kong und einige Übersee-Chinesenpopulationen behielten ebenfalls ihre traditionellen Zeichen bei. Somit dürften es also wieder die Chinesen insgesamt sein, die die meisten Zeichen haben. Und bis zur Einführung von Unicode hatten sie - notwendigerweise - auch die umfangreichsten Zeichensätze. Ja, Mehrzahl - denn davon gab es nicht nur einen sondern historisch bedingt einige (MySQL kennt 9 Asian Character Sets).
Das Nein zur zweiten Frage sollte nun auch klar sein. Da es mehrere chinesische Zeichensätze (und Kodierungen) gibt, kann man nicht automatisch von "Chinesisch" auf alle anderen schließen. Ebensowenig kann man von Unicode/UTF auf alle anderen schließen. Wenn ein Programm mit einer bestimmten Kodierung umgehen kann, "klappt" genau diese eine Kodierung. Für die anderen Kodierungen müssen jeweils deren Eigenarten berücksichtigt werden und demzufolge jeweils eine individuelle Unterstützung ins Programm eingebaut sein. Das gilt vor allem bei Stringverarbeitung. Um beispielsweise Wortgrenzen erkennen zu können, muss bekannt sein, welche Zeichen Wortgrenzen darstellen und wie diese im Bytestrom der jeweiligen Kodierung zu erkennen sind.
Lo!