6

Unicode 文字列を utf-8 または utf-16 文字列に変換する方法は? 私のVS2005プロジェクトはUnicode文字セットを使用していますが、cppのsqliteは提供しています

int sqlite3_open(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);
int sqlite3_open16(
  const void *filename,   /* Database filename (UTF-16) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);

フォルダを開くため。文字列、CString、または wstring を UTF-8 または UTF-16 文字セットに変換するにはどうすればよいですか?

どうもありがとう!

4

5 に答える 5

7

簡潔な答え:

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() を直接使用できます。変換は必要ありません。文字は、char16 ビットを使用する 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ます。

于 2008-11-11T09:38:31.537 に答える
7

WideCharToMultiByte関数を使用します。パラメータに指定CP_UTF8CodePageます。

CHAR buf[256]; // or whatever
WideCharToMultiByte(
  CP_UTF8, 
  0, 
  StringToConvert, // the string you have
  -1, // length of the string - set -1 to indicate it is null terminated
  buf, // output
  __countof(buf), // size of the buffer in bytes - if you leave it zero the return value is the length required for the output buffer
  NULL,    
  NULL
);

また、Windows の Unicode アプリのデフォルトのエンコーディングは UTF-16LE であるため、翻訳を実行する必要はなく、2 番目のバージョンを使用するだけでよい場合がありますsqlite3_open16

于 2008-11-11T08:44:01.070 に答える
3

すべての C++ 文字列型は文字セット ニュートラルです。文字幅に落ち着くだけで、それ以上の仮定はありません。wstring は Windows で 16 ビット文字を使用します。これはおおよそ utf-16 に対応しますが、スレッドに何を格納するかによって異なります。wstring は、入力するデータが有効な utf16 でなければならないことを強制するものではありません。ただし、UNICODE が定義されている場合、Windows は utf16 を使用するため、ほとんどの場合、文字列は既に utf16 であり、何もする必要はありません。

他のいくつかは、utf16 を utf8 に変換する方法 (の 1 つ) である WideCharToMultiByte 関数の使用を提案しています。ただし、sqlite は utf16 を処理できるため、その必要はありません。

于 2008-11-11T08:46:58.253 に答える
0

これを行う最も簡単な方法は、CStringA を使用することです。CString クラスは、CStringA (ASCII バージョン) または CStringW (ワイド char バージョン) の typedef です。これらのクラスには両方とも、文字列型を変換するコンストラクタがあります。私は通常使用します:

sqlite3_open(CStringA(L"MyWideCharFileName"), ...);
于 2014-08-22T21:56:14.540 に答える
0

utf-8 と utf-16 はどちらも「Unicode」文字エンコーディングです。おそらくあなたが話しているのは、固定サイズの文字エンコーディングである utf-32 です。多分探して

"Convert utf-32 into utf-8 or utf-16"

これに関するいくつかの結果または他の論文を提供します。

于 2008-11-11T08:44:55.263 に答える