こんにちは。
いつもお世話になっています。
開発環境は、win7(sp1)、delphiXE3 enterprise(updateなし)、SQLite3です。
SQLiteへのアクセスには、DLしたラップファイル(?)を使っています。
ここでいうラップファイルは、SQLite3.pas、SQLiteTable3.pas、sqlite3.dllです。
SQLiteの文字コードはutf8です。
やりたいことは、utf8(bomなし)のファイルを読み込んで変数に入れて、それをSQLiteに書き込むということです。
それで、変数に入れるまでの、以下のようなコードを書いてみました。
var
tf:TextFile;
sLine:UTF8String;
AssignFile(tf,fn);
Reset(tf);
while not Eof(tf) do
begin
Readln(tf,sLine);
inc(iCount);
setlength(sResult,iCount);
sResult[iCount-1]:=UnicodeString(sLine);
end;
CloseFile(tf);
画面で入力した文字をSQLiteにinsertしても文字化けしません。
ということは、ラップファイルがユニコードからutf8に変換してくれているんだろうと考えています。
utf8としてファイルを読み込んで、delphiに渡すので(変数に入れるので)、ユニコード(utf16)に変換しなきゃと考えました。
僕のコード→ラップファイル→SQLiteと流れると思われるので、ユニコードに変換して変数に入れました。
それでも、SQLiteには文字化けしてinsertされてしまいます。
僕のコードが間違っているのか、考え方が間違っているのか分かりません。
申し訳ございませんが、教えてください。
よろしくお願いします。
先ほど書いたコードで、受け取る変数の型を書くのを忘れていました。
sResultはwidestringの配列です。
よろしくお願いします。
もし sResult が TStringList なのであれば、
sResult で直接 LoadFromFile() すればいいのではないでしょうか?
sResult.LoadFromFile(fn, TEncoding.UTF8);
sResult が文字列の配列 (array of string) なのであれば、
var
i: Integer;
SL: TStringList;
begin
SL := TStringList.Create;
try
SL.LoadFromFile(fn, TEncoding.UTF8);
SetLength(sResult, SL.Count);
for i:=0 to SL.Count-1 do
sResult[i] := SL[i];
finally
SL.Free;
end;
end;
こんな感じになります。
> sResultはwidestringの配列です。
では下のコード例で。
ありがとうございます。
教えてもらったコードで上手くいきました。
あの申し訳ありませんが、勉強のためにも、いくつか教えてください。
僕のコードは何故ダメだったんでしょうか。
変数に入れただけではutf-8にならないのでしょうか(もともとがutf-8なんで大丈夫かと思いました)。
僕の考え方はまずかったのでしょうか。
僕のコード→ラップファイル→SQLiteと流れると思われるので、ユニコードに変換して変数に入れました。
delphiの変数内部では、ユニコード(utf16)で扱われると思っていたのですが。
UnicodeString(sLine)ではユニコード変換にならないんでしょうか。
申し訳ございませんが、よろしくお願いします。
ツイート | ![]() |