sqlite3_column_text()を使って2バイト文字を扱いたいです。
何か良い方法はないでしょうか?
以下のようなソースで結果を受け取ると表示の時に文字化けしてしまいます。
【ソース】
std::string strtest = sqlite3_column_text(stmt, 3);//sqlite3_column_text(stmt, 3)の結果は2バイト文字
【調べた結果】
http://shufuginia.blogspot.jp/2012/10/iossqlite_5.html
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
みなさんから教えていただいた内容で、もう一度原因を考え直した結果解決しました。
sqlite3_column_text()は、UTF-8としてTEXTデータを返すということで、そもそもUTF-8形式でデータが格納されているか確認しました。
データがShift-JIS形式のテキストで格納されていてこれが原因でした。
テキストファイルからSqliteにデータの格納を行っていたので、そのテキストファイルをUTF-8にすることで解決できました。
※Visual Studio 2015のウォッチ式などでは、文字化けしていますが今のところ画面表示などへの影響は出ていません。
【参考URL】
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12112358847
投稿2016/01/17 00:57
総合スコア20
0
SQLiteが扱う文字コードはUTF-8かUTF-16で、sqlite3_column_textはUTF-8の文字列を返し、sqlite3_column_text16はUTF-16で返します。ですので、使う際はそのいずれかに対応していなければなりません。
文字化けの原因は様々なので、開発環境(OSやコンパイラなど)が判らないと正確に判断できませんが一般的な対処法としては、以下のような感じです。
Windowsの場合は直接UTF-8を扱うことはできませんが、ネイティブ文字コードがUTF-16でワイド文字(wchar_t)として扱っているので、sqlite3_column_text16をワイド文字(wchar_t *)でキャストしてwstringで取得すれば正しく処理できます。C標準関数はワイド文字系(wchar.h)をご使用ください。
Linux(Unix系OS)では言語設定がja_JP.UTF-8
であれば問題なく表示されるはずです。
ところで、2バイト文字というのは文脈によっては曖昧です。Shift-JISにおける2バイト文字というといわゆる全角文字のことを指しますが、UTF-16は2バイトで1文字を表すという意味で2バイト文字といえるかもしれません。
ちなみに、UTF-8は最大で4バイトになります。
追記
もしかしたらロケールの設定をしないといけないかもしれません。C/C++では初期ロケールが"C"でASCII文字しか対応できないので、setlocale(LC_ALL, "")
とやってシステムの地域情報を反映させる必要があります。
投稿2016/01/16 05:09
編集2016/01/16 05:15総合スコア5938
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
2バイト文字というとUTF-16だと思われますが、UTF-16はsqlite3_column_text16
を使うといいみたいです。
https://www.sqlite.org/capi3ref.html#sqlite3_column_blob
データがUTF-8であっても自動でUTF-16にしてくれるようです。ただ、void *が返るようなので、char16_t *にキャストとしてから、std::u16stringに入れる必要があると思います。
投稿2016/01/16 03:41
総合スコア21735
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
こんにちは。
SQLiteは知らないのですが、C/C++ Interface For SQLite Version 3 [日本語超訳版]によるとsqlite3_column_text()はUTF-8で文字列を返却するようです。
sqlite3_column_text()は、UTF-8としてTEXTデータを返します。
提示されたリンク先の記述とは異なりますね。どちらが正しいか私には分かりませんが、ここにもUTF-8を扱えると書かれていますし、提示先の記述が間違っている可能性があると思います。(UTF-8の存在を知らないかも。)
であれば、SQLiteのデータベースへUTF-8で保存し、sqlite3_column_text()で取り出して、UTF-8として表示すれば文字化けしない筈です。
Linuxならデフォルトの文字コードはUTF-8なので、単純にASCII文字列として処理しても文字化けしないと思います。
Windowsの場合はデフォルトの文字コードがShift-JISなので環境と目的に応じた工夫が必要です。
因みにUTF-8はUnicodeを8ビット文字列へエンコードする方式です。メモリ効率が多少悪いですが国際化(いわゆる2バイト文字)が必要な場面では非常にありがたい文字コードです。
投稿2016/01/16 03:27
総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。