VisualStudioで文字コードに2,3日翻弄された話+その解決策

プログラミング

 どうも、皆様お疲れ様です。
今回もプログラムに関連しての備忘録。(ゲームもしたい・・・A列車続きしたい・・・)
自分が詰まったところは誰かが詰まることもあるはずということで、VisualStudioの文字コードに翻弄され続けた末の解決策の話。
では本題へ。

どのような状況だったのか。

 まず今現在自分の状況から書いていきます。
IDE(統合開発環境)としてVisualStudioを用いてC/C++で自身の趣味を含んだ開発を行っております。スキル・技術としては正直3流以下で、ChatGPTの助けを借りながら理想に向けて邁進しておりまます・・・!
そんな中で恒久的にデータを保持する手段としてSQLデータベースの利用をしようと、検討の結果思い立ったのですが、そこが地獄の始まりでした・・・。

SQLiteを使用して導入するまでは順調だったが・・・。

 このSQLデータベースをどういう風な意図で利用しようか1というと、”SQL文というコマンドによってデータベースを操作してデータベースへのアクセスを一意なものにしちゃおう”ということと”自身でガバガバなデータ管理クラスをつくって無駄なデバッグに労力を割くのをやめよう”ということを考えたわけですね。あまりピンと来てない人向けに言いますと、Excelのような表形式にできる情報2をデータベースで管理しようということです。
ライブラリはsqlite3と呼ばれるライブラリを導入しました。
他のSQLライブラリと比べてサーバーをつくらずとも、ローカルで完結して軽量なため、小規模でもし行くところまで行ったとしても中規模が限界な自分のプロジェクトにはぴったりな選択だったと思います。

SQL自体はそこかしこで使われるようなメジャーなデータベース言語だったので、文献も豊富ですし、GPTの回答も解決策となるようなものも多く実装は順調でした。そんな中で問題が出てきます。
それはINSERTで”文字列”として挿入したはずの要素がBLOB型(バイナリ)として保存されていたということです。(下記はsqlite3の関数ではなくSQL文での表記)

INSERT INTO NounDictionary (Name, Language, PartOfSpeech, Synonyms, Antonyms, RelatedNouns, Reference, Attributes, Description, IsTopicVisible)
VALUES ('犬', 'ja', '名詞', 'ワンコ,ドッグ', '猫', '猫', 'res/images/dog.png', '{"type": "名詞", "category": "動物", "traits": ["忠実", "可愛い"]}', '犬科の哺乳類。', 1);

上記のようなコードにおいて日本語部分のみ挿入前の形を保てませんでした。これを直そうと思って四苦八苦・・・。解決まで2,3日かけてしまいました。(会社だったらクビですね)

結末は単純なことで解決へと・・・。

 そんなこんなでモチベーションも下がりつつあったのですが、ChatGPTの回答に文字コードが悪いんじゃないかという話がちらほら。それらの修正は効果がなかったのですが、そういえばとVisualStudioの標準の日本語文字の文字コードってなんかいろいろ引っかかるみたいな話何だっけ・・・、という朧げな記憶を引っ張りだしたどり着きました。

    std::map<std::string, std::string> newElement = {
       {u8"Name", u8"犬"},
       {u8"Language", u8"ja"},
       {u8"PartOfSpeech", u8"名詞"},
       {u8"Synonyms", u8"ワンコ,ドッグ"},
       {u8"Antonyms", u8"猫"},
       {u8"RelatedNouns", u8"猫"},
       {u8"Reference", u8"res/images/dog.png"},
       {u8"Attributes", u8R"({"type": "名詞", "category": "動物", "traits": ["忠実", "可愛い"]})"},
       {u8"Description", u8"犬科の哺乳類。"},
       {u8"IsTopicVisible", u8"1"}
    };

 上記のような挿入する要素をu8のプレフィックスを接頭に付けて3文字列の扱いを”UTF-8”にすることで、INSERTで挿入しても要素の名前がBLOB型にされることがなくなりました。
結論としてはVisualStudioで標準で扱う文字コードが”Shift-JIS”、SQLデータベースで扱う文字コードが”UTF-8”というだけの話だったんですね・・・。SQLはそりゃそうだって話だったんですけど、VisualStudioが標準そっちだったかというのは完全に抜けていましたね・・・。
そんなこんなでようやく迷宮から抜けられそうなのでここから開発を加速させたいですね・・・!

またプロジェクトやファイルごとに扱う文字コードをUTF-8に変更する方法もありますが、検索した時にたくさん見たのでたぶん自分が書くよりも詳細な説明が載っているでしょう。もしくはChatGPTに聞いてもいいと思います!
余談ですが最近のChatGPT、プロジェクトでやりやすくなりましたよね。・・・ファイル読み込みや古いファイルの参照に弱いのはあいも変わらずですが・・・。

自分が使っているSQL関連のあれこれについて(2つだけですが・・・)

 では最後に今自分が使っているSQL関連の便利なあれこれを2つだけ紹介して終わります。

一つ目はVisualStudioに導入して使っているSQLite。
https://www.sqlite.org/download.html(自分はsqlite-amalgamation-3480000.zipをつかっています。目的ごとに違うので気になる人は調べてみてください。)
C++のコードでSQLを簡易に使えるのでSQLデータベース初心者におススメです。
前述の通り、オフラインでローカルのデータベースとして扱えるので小規模の開発に向いています。
逆にオンラインで多数からの接続を想定している場合には他のSQLライブラリの方が向いているかも・・・?
もう一つはDBファイルの中身を見れるDB Browser for SQLiteです。
https://sqlitebrowser.org/
ローカルにデータベースファイルが生成されるSQLiteではDBファイルを見ることが出来ます。
これを用いることでデバッグや開発がはかどります!
また開いたデータベースファイルに対してSQL文の直接実行もできたりするので、そこもいいですね。
ということでこれを新たな備忘録としたいと思います。
また見に来ていただけたら嬉しいです。それでは。

  1. SQLがどういうものかというものを断言してしまうと、いろいろと語弊を生んでしまうので今回は自分が使うに至った理由を書いています。 ↩︎
  2. ExcelのようなGUI(グラフィックで操作する)ではなく、CUI(コンソールでコマンドで操作)なので慣れるまで時間が必要でした・・・。 ↩︎
  3. 応急処置的な扱いの方がいいのかな・・・とか、思ったり思わなかったり。
    でもファイルやソリューション単位で変更すると今までのコードでエラーを起こすので不用意に全部統一するのはご法度ですわね・・・。 ↩︎
タイトルとURLをコピーしました