簡潔な答え:
CString や wstring などの Unicode 文字列を使用する場合、変換は必要ありません。sqlite3_open16() を使用します。WCHAR ポインター (にキャストされていることを確認する必要がありますvoid *
。不自由に思えます! この lib がクロスプラットフォームであっても、プラットフォームに依存し、 a よりも友好的でないワイド char 型を定義できたと思いますvoid *
) にAPI。CString の場合など:(void*)(LPCWSTR)strFilename
より長い答え:
UTF8 または UTF16 に変換する Unicode 文字列がありません。特定のエンコーディングを使用してプログラムで表現された Unicode 文字列があります。Unicode は、それ自体はバイナリ表現ではありません。エンコーディングは、Unicode コード ポイント (数値) がメモリ内でどのように表現されるかを示します (数値のバイナリ レイアウト)。UTF8 と UTF16 は、最も広く使用されているエンコーディングです。しかし、それらは非常に異なります。
VS プロジェクトで「Unicode charset」と表示されている場合、実際には「文字は UTF16 としてエンコードされている」ことを意味します。したがって、sqlite3_open16() を直接使用できます。変換は必要ありません。文字は、char
16 ビットを使用する WCHAR 型 ( ではなく) で格納されます (Win32 では 16 ビットを使用する標準 C 型wchar_t
のフォールバック。他のプラットフォームでは異なる場合があります。Checkers さん、訂正ありがとうございます)。
もう 1 つ注意が必要な点があります。UTF16 には、ビッグ エンディアンとリトル エンディアンの 2 つの種類があります。これが、これらの 16 ビットのバイト順です。UTF16 用に指定した関数プロトタイプは、どの順序が使用されているかを示していません。ただし、sqlite が Windows と同じエンディアンを使用していると仮定すると、かなり安全です (リトル エンディアン IIRC。順序は知っていますが、常に名前に問題がありました :-) )。
編集:チェッカーによるコメントへの回答:
UTF16 は 16 ビットのコード単位を使用します。Win32 では ( Win32のみ)、wchar_t
このようなストレージ ユニットに使用されます。秘訣は、一部の Unicode 文字では、2 つの 16 ビット コード単位のシーケンスが必要になることです。それらはサロゲート ペアと呼ばれます。
同じように、UTF8 は 1 から 4 バイトのシーケンスを使用して 1 文字を表します。ただし、タイプには UTF8 が使用されchar
ます。