文字コードについて


やまだ  2013-10-13 00:59:14  No: 45421

こんにちは。

いつもお世話になっています。
開発環境は、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されてしまいます。

僕のコードが間違っているのか、考え方が間違っているのか分かりません。

申し訳ございませんが、教えてください。

よろしくお願いします。


やまだ  2013-10-13 01:34:33  No: 45422

先ほど書いたコードで、受け取る変数の型を書くのを忘れていました。

sResultはwidestringの配列です。

よろしくお願いします。


DEKO  2013-10-13 01:52:41  No: 45423

もし 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;

こんな感じになります。


DEKO  2013-10-13 01:53:30  No: 45424

> sResultはwidestringの配列です。
では下のコード例で。


やまだ  2013-10-13 07:57:51  No: 45425

ありがとうございます。

教えてもらったコードで上手くいきました。

あの申し訳ありませんが、勉強のためにも、いくつか教えてください。

僕のコードは何故ダメだったんでしょうか。
変数に入れただけではutf-8にならないのでしょうか(もともとがutf-8なんで大丈夫かと思いました)。

僕の考え方はまずかったのでしょうか。
僕のコード→ラップファイル→SQLiteと流れると思われるので、ユニコードに変換して変数に入れました。
delphiの変数内部では、ユニコード(utf16)で扱われると思っていたのですが。
UnicodeString(sLine)ではユニコード変換にならないんでしょうか。

申し訳ございませんが、よろしくお願いします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加