Wenn wir die UTF8-codierten Inhalte aus der DB rauslassen wollen, müssen wir sie wieder nach Win1252 zurückcodieren. Das ist vom Prinzip her so einfach wie die Konversion von Win1252 nach UTF8, vom Code her aber länger. Das liegt daran, dass wir nicht nur 256 mögliche Zeichen zum konvertieren haben, sondern über 65.00 Zeichen als Eingangsdaten, die wir auf 256 Ausgabezeichen beschränken müssen. Wenn wir alle UNICODE-Zeichen in Blöcke von 256 Zeichen aufteilen, finden wir alle Win1252-Zeichen in 5 Blöcken wieder. Nur diese brauchen wir, und müssen sie dementsprechend definieren. Der sechste Block definiert, wo im UNICODE-Standard diese Blöcke anzusiedeln sind.
Die C++-Implementierung der Konversionsfunktion sieht so aus
Diese Funktion greift auf die Funktion my_utf8_uni zu, die wiefolgt aussieht.
Dieser Funktion übergeben wir einen Pointer zu einem UTF8-String. Sie gibt die Anzahl der Bytes zurück, die das erste Zeichen einnimt. Im ersten Parameter gibt sie zurück, um welches UCS2-Zeichen es sich handelt. Handelt es sich um ein ungültiges Zeichen, wird es in der SQLite3-Funktion in den Rückgabestring mit einem Byte pro Zeichen übernommen wie es ist. Kann es einem Win1252-Zeichen zugeordnet werden, wird überprüft, in welchem 256-Zeichen-Block im UNICODE-Standard es angesiedelt ist, und dementsprechend zugeordnet.
In SQLite eingebunden wird das ganze mit der Anweisung:
Coldfusion
->SerializeJSON

GCC
->Cross-Compiling

MySql
->Prep. Stmts

SQLite3
->Mem-Structure
->Prep. Stmts
->ToUTF8-Func
->ToWin1252-Func

UTF-8
->UTF-8 To UCS2

VB
->MD5-Class

VC++
->BZip2
->ATL


HOME