2011-10-23 10 views
1

SQLite3を使用してデータベースとの間で読み書きを行う小さなアプリケーションを実装しました。データベースに追加する必要があるレコードには、アラビア語のテキストがあり、データベースに格納されたときに、読み込み不能なテキストと解釈されないテキストに変換されます。私は問題を解決するために何ができるSQLite3は読み込み不可能なテキストを格納します

  • sqlite3_open
  • sqlite3_prepare
  • sqlite3_bind_text sqlite3_step

:私は書き込み&読み取りのためにこれらのAPIを使うのか?

+0

メモリ内のテキストはどのようなエンコーディングですか? – millimoose

答えて

1

ほとんどの場合、テキストは非ASCIIエンコーディングである可能性があります。例えば、ユニコードである。

これは、ASCIIテーブルには0から127までの整数で表される文字しかないためです。アラビア文字を表すために使用できるものは何もありません。

  • アラビア語(0600-06FF、224文字)
  • アラビアサプリメント(0750-077F、48文字)
  • アラビア表示形A:たとえば、Unicodeは、アラビア語を表現する5つの異なる範囲を使用しています(FB50-FDFF、608文字)
  • アラビア表示形B(FE70-FEFF、140文字)
  • ルミ数字記号(10E60-10E7F、31文字)

そして8ビットの値(charタイプ、1バイトの長さを持つ)が許すより多くの文字/文字が存在する可能性があるので、それらの文字の一部(またはすべて)を表すためにワイド文字が使用されます。

結果として、文字列の長さは文字列の長さとバイト単位で異なります。私の前提は、sqlite3_bind_text関数を使用すると、4番目のパラメータとしていくつかの文字を渡すのに対して、それはバイト数でなければならないということです。または、データベースから文字列を読み戻すときに、この長さを誤って解釈する可能性があります。 sqlite3_bind_textドキュメントは四番目のパラメータについてはこれを言っている:四番目の引数を持っているそれらのルーチンで

、その値は、パラメータのバイト数 です。明確にするには、数値は文字数ではなく、値の中の バイトの数です。 4番目の パラメータが負の場合、文字列の長さは最初のゼロターミネータまでのバイト数 です。

正しいことを必ず実行してください。

も参照してください:

幸運を!

+0

Unicodeはエンコードではありません。 Unicodeは、通常、UTF-8またはUTF-16(後者は主にWindowsで使用されます)としてエンコードされます。 –

関連する問題