質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Q&A

1回答

4301閲覧

VC++ CStringをUTF8で使用したい

moto-a

総合スコア17

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

0グッド

1クリップ

投稿2019/02/15 04:25

編集2019/02/15 04:58

お世話になります。

VC++でsqliteのデータを読み込むプログラムを作成していますが、
sqlite3_prepare_v2の引数でSQL文はUTF-8で渡す必要があります。
SQL文に日本語が含まれない場合は、問題ないのですが、カナでデータ抽出したい場合に困っています。CStringはデフォルトだとユニコードとなるようです。
CStringAに変えてみましたがうまくいきませんでした。
CStringでUTF-8を使用するにはどのようにしたらよいでしょうか?

よろしくお願いします。

VC++(VS2017)

1CString sql; 2sql = "select cd, aaa, kana from hoge where aaa is not null"; 3sql = sql + " and kana like 'ゴ%'" 4sqlite3_prepare_v2(pDB, sql, -1, &pStmt, NULL);

OKなソース

1const char* sqlUTF8 = u8"select cd, aaa, kana from hoge where aaa is not null and kana like 'ゴ%'"; 2sqlite3_prepare_v2(pDB, sqlUTF8, -1, &pStmt, NULL);

■追記 以下のようにCT2Aで変換してみてもダメでした(データが抽出されない)

CString sql; sql = "select cd, aaa, kana from hoge where aaa is not null"; sql = sql + " and kana like 'ゴ%'" CT2A aaa(sql, CP_UTF8); sqlite3_prepare_v2(pDB, aaa.m_psz, -1, &pStmt, NULL);

定義
SQLITE_API int sqlite3_prepare_v2(
sqlite3 db, / Database handle. */
const char zSql, / UTF-8 encoded SQL statement. /
int nBytes, /
Length of zSql in bytes. */
sqlite3_stmt *ppStmt, / OUT: A pointer to the prepared statement */
const char *pzTail / OUT: End of parsed string */
)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

こんにちは。

"CString UTF-8"で検索すると英語ですが、ほぼぴったりな記事がありました。

CStringWはユニコード(UTF-16)です。
CStringAはマルチバイト文字(日本語なら所謂Shift-JIS)を想定しているそうです。
記事にはUTF-8へ変換してCStringAで保持する短いコードが記載されてます。
変換してからsql関数へ与える、受け取ってからCStringWへ変換する にて対処できると思います。

投稿2019/02/15 05:01

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moto-a

2019/02/15 11:13

こんにちは。ご回答ありがとうございます。 教えていただいたリンクを参考にコードを作り直してみました。 CStringW sql; sql = "select cd, aaa, kana from hoge where aaa is not null"; sql = sql + " and kana like 'ゴ%'" CStringA sqlUTF = ConvertUnicodeToUTF8(sql); sqlite3_prepare_v2(pDB, sqlUTF, -1, &pStmt, NULL); CStringをCStringWに変更し、CStringWからCStringAに変換する関数(リンク先)を利用してCStringAしてsqlite3_prepare_v2でデータ抽出。 これでうまくいってそうに思いますが、大丈夫でしょうか?
Chironian

2019/02/15 12:48

MFCは使っていないのでCStringの仕様を把握していませんが、危うい印象を受けます。 VC++で"漢字文字列"はShift-JISコードでエンコードされた文字列になります。 それを CStringWへ代入した際にUTF-16へ変換される仕様であれば一応OKです。 しかし、Shift-JISとUnicode間の変換は常にリスクがある(片方にしかない文字は化ける等)ので、最初からUnicodeである L"漢字文字列"を使った方が安全です。更にソース・ファイルの文字コードがShift-JISだと同じリスクがあるので、BOM付きUTF-8でエンコードするのがお薦めです。
moto-a

2019/02/18 02:20

ありがとうございます。以下のように変えてみました。 CStringW sql; sql = L"select cd, aaa, kana from hoge where aaa is not null"; sql = sql + L" and kana like 'ゴ%'" CStringA sqlUTF = ConvertUnicodeToUTF8(sql); sqlite3_prepare_v2(pDB, sqlUTF, -1, &pStmt, NULL);
Chironian

2019/02/18 04:16 編集

正常に動作しているようでしたら、特に問題点はないように感じます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問