I am still having issues trying to get my charaters standardizsed. I spent
> all of yesterday playing with ideas but it still in the dark.
Whatever you were doing the first time was fine:
I have been having that very thought!
So if I look at a name with umlaughts in the database via sqlite3.exe I
get:
>
> Städt. Klinikum Neunkirchen gGmbH
> --
> |
> an "a" with two dots on top
That text was properly encoded as UTF-8. The ONLY issue with that
line is that the sqlite shell under Windows is incapable of displaying
Unicode, so you need to retrieve the data from sqlite using a tool
that is. The actual storage of it is perfect.
I know the console sqlite3 wont show it. The delphi control I am using does
unicode.
> If I add the text using the *16 prepare and then retrieve it using the
*16
> column_text, I still get the two seperate characters instead of the
umlaught
> thingie. So I can only assume that somehow my source isnt UTF-16. or I
am
> converting it somewhere in the middle. This is possible since I am using
> Delphi and it has some implicit convertions, but I think I have got that
> under control.
AFAIK Delphi has no built-in Unicode support at all; you will need to
find third-party support for everything, from processing to display
controls. It is likely you are ending up with UTF-8 data at some
point in the pipeline, and whatever you're doing to process it does
not understand UTF-8.
Yeah I am currently using VirtualTree from Mikes Delphi Gems. Its fully
unicode enabled (I beleive). I use WideStrings through out the entire
pipeline from xml I recieve into SQLite via the prepare16 back out through
column_text16 into virtual tree. Well thats true, the SQL APIs are mapped to
return PWideChar which is then copied via System.Move into a widestring as
follows:
Show code :)
* DLL *
function sqlite3_open(filename: PWideChar; var db: pointer): integer;
cdecl; external 'sqlite3.dll' name 'sqlite3_open16';
function sqlite3_close(db: pointer): integer; cdecl; external 'sqlite3.dll
';
function sqlite3_exec(db: pointer; sql: PWideChar; callback: pointer;
userdata: PWideChar; var errmsg: PWideChar): integer; cdecl; external '
sqlite3.dll' name 'sqlite3_exec16';
procedure sqlite3_free(ptr: PWideChar); cdecl; external 'sqlite3.dll';
function sqlite3_prepare(db: pointer; sql: PWideChar; nBytes: integer; var
stmt: pointer; var ztail: PWideChar): integer; cdecl; external 'sqlite3.dll'
name 'sqlite3_prepare16';
function sqlite3_column_bytes(stmt: pointer; col: integer): integer; cdecl;
external 'sqlite3.dll' name 'sqlite3_column_bytes16';
function sqlite3_column_text(stmt: pointer; col: integer): PWideChar;
cdecl; external 'sqlite3.dll' name 'sqlite3_column_text16';
*CLASS*
function TSqliteQueryResults.FieldAsString(i: integer): WideString;
var
size: integer;
temp: PWideChar;
begin
size := FieldSize(i);
SetLength(result, size div 2);
temp := sqlite3_column_text(Fstmt, i);
System.Move(sqlite3_column_text(Fstmt, i)^, PWideChar(result)^, size);
end;
function TSqliteQueryResults.FieldSize(i: integer): integer;
begin
result := sqlite3_column_bytes(Fstmt, i);
end;
***** END ****
Previously (before my langauge headaches :-) ) I was doing the above
without the APIs ending in 16, and everything was string and PChar in the
above layer. The layer that used this class has always had "WideString".
I realise your probably not delphi pros, but if you do spot something stupid
I am doing I would appreciate any help you can offer.
Thanks,