SQLite3 stellt alle Funktionen in 2 Varianten zur Verfügung. Eine UTF8-Version und eine UTF16-Version. Die Funktionen heßen aber hauptsächlich so, darum, dass Daten UTF8-kodiert gespeichert werden, muss man sich selber kümmern. Daher habe ich, aus der MySQL-Implementierung abgeschaut, eine Funktion geschrieben, die Windows1252-kodierte Eingaben nach UTF8 umwandelt.

Was es dazu braucht ist zuerst eine Tabelle, die jedem Windows1252-Zeichen das zugehörige UNICODE-Zeichen (UCS2) zuordnet. Diese finden wir "gebrauchsfertig" beispielsweise in der MySQL-Source-Distribution in der Datei ctype-latin1.c im Verzeichnis strings. Eine andere Version finden wir im Quellcode der libiconv, wie sie bei CygWin (Snapshot) mitgeliefert wird, unter libc\iconv\ccs\win_1252.c
An dieser Version habe ich mich orientiert. Der Zeichensatz Windows1252 kennt interessanterweise Zeichen, die UNICODE nicht kennt. Diese weren im MySQL-Bsp. mit 0x0000 dargestellt. CygWin nutzt dafür 0xFFFF (INVALC). Tabelle In unserer SQLite-Funktion gehen wir davon aus, dass wir einen Windows1252 kodierten NULL-terminierten String mit einem Byte pro Zeichen übergeben bekommen. Wir allokieren einen zweiten String, der dreimal so lang ist wie der Ausgangsstring, gehen jedes Zeichen durch, suchen aus der Tabelle den UCS2-Code heraus und rechnen es in UTF8 um. Dieses schreiben wir in den Zielstring und übergeben ihn der Funktion sqlite3_result_text(...), die ihn als Funktionsergebnis zurückliefert. Zeichen, für die kein UNICODE-Pendant existiert, überspringen wir. Code 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