Ich habe zwei Dateien mit jeweils unterchiedlichen Hex Editoren geöffnet und bei beiden steht was anderes ?!
Reihe 1 : HxH Hexeditor
Reihe 2 : Notepad++ HexEditor
Code:
33 34 32 7C AA FC BA B8 C2 C4 C4 F5 B3 CC B7 A5 AD 50 AA BA A4 75 B7 7E C3 C0 B3 4E A6 62 B3 6F 5F D8 B0 D5 7C 0D 0A
33 34 32 7c e9 98 bf e7 88 be e8 96 a9 e8 98 ad e6 9c 80 e6 a5 b5 e8 87 b4 e7 9a 84 e5 b7 a5 e6 a5 ad e8 97 9d e8 a1 93 e5 9c a8 e9 80 99 e8 a3 8f e5 95 a6 7c 0d 0a
Der Hex String von Notepad++ ist auch viel länger.. was macht Notepad++ da bitte ? Die Datei hat keinen DOM und Notepad++ erkennt sie als Big5 (was auch richtig ist). Es wird auch alles korrekt in Chinesisch angezeigt. NPP+ verwendet Keine Codepage 950 ! CP950 belegt pro Zeichen maximal 2 Byte. Hier haben wir auch Zeichen mit 3 Byte. Es wird die native Chinesische Implementierung mit bis zu 4 byte pro Zeichen verwendet.
Die Datei scheint im CP950 Format zu sein. Warum macht Notepad++ sowas ?
Dies ist wichtig, da ich meine eigene Codepage Umwandlung in c++ schreibe. ICU + boost halte ich für zu viel. Meine Funktion ist minimal und funkioniert... außer ich stoße auf ungewollte Zeichen. (Alles im Bereich über 0xF7 als Erkennungsbyte ist laut offizieller Codepage nicht zulässig)
edit:
7c e9 98 ist das originale chinesische Zeichen und 7C AA ist das selbe Zeichen in der CP950.
CP950 wandelt alle 3 und 4 byte langen chinesischen Zeichen in eigenes 2 byte Format um.
Aber mal ernsthaft.. warum macht Notepad++ sowas....
Naja was solls... so ist es einfacher. Aber dauerte echt ewig bis ich das herausgefunden habe, da np++ so einen murks machte.
Falls jemand interessiert ist:
buffer enthält die Bytefolge in char
Auslesen einer originalen Implementierung mit bis zu 4 byte pro Zeichen:
Code:
if ((unsigned int)static_cast<unsigned char>(buffer[i]) <= 0x7F) //1 byte lang
if ((unsigned int)static_cast<unsigned char>(buffer[i]) <= 0xDF) //2 byte lang
if ((unsigned int)static_cast<unsigned char>(buffer[i]) <= 0xEF) //3 byte lang
if ((unsigned int)static_cast<unsigned char>(buffer[i]) <= 0xF7) //4 byte lang
CP950:
Code:
if ((unsigned int)static_cast<unsigned char>(buffer[i]) <= 0x7F) //1 byte lang
else //2 byte lang