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

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

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

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

5回答

5758閲覧

sqlite3_column_text 2バイト文字を使う方法

fNaoyuki

総合スコア20

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/01/16 01:55

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ページで確認できます。

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

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

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

guest

回答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

fNaoyuki

総合スコア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
catsforepaw

総合スコア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

raccy

総合スコア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-8Unicodeを8ビット文字列へエンコードする方式です。メモリ効率が多少悪いですが国際化(いわゆる2バイト文字)が必要な場面では非常にありがたい文字コードです。

投稿2016/01/16 03:27

Chironian

総合スコア23272

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

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

0

知識が少ないので外しているかも知れませんが・・・
そもそもSQLiteの文字(文字列)は、UTF-8など1バイト文字とは違うと思っていますが、エンコードはどうなっていますか?

投稿2016/01/16 02:44

cateye

総合スコア6851

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問