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

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

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

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

解決済

1回答

5323閲覧

vbaでレコードセットから値を取得して、文字列として表示すると文字化けする

kuri_dev

総合スコア8

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

0グッド

0クリップ

投稿2020/03/30 08:34

編集2020/03/30 08:35

AccessでレコードセットからDictionary(連想配列オブジェクトへ漢字、半角カタカナを含む日本語文字列を入れ、文字列として確認したときに文字化けが発生してしまうのですが、何か解決方法はないでしょうか?

  • 問題の文字列

例えば、このように文字化けが発生してしまいます。
"product_name": "SKS2\u677F\uFF7D\uFF77\uFF9D\uFF8A\uFF9F\uFF7D"

  • やってみたこと

文字コードの問題のような気はするのですが、strConvを使用してみてもダメでしたし、うまくいきませんでした。

  • 現状分かっていること

accessのテキストボックスコントロールから値を取得した場合には、文字化けは起こりません。
レコードセットから値を取得し、オブジェクトへ値を代入して値を確認すると文字化けします。

  • コード

vba

1 Dim rsW As DAO.RecordSet 2 Dim strSQL As String 3 Dim JsonObject As Object 4 Dim records As String 5 6 Dim strTest As String 7 8 strSQL = "SELECT * FROM dbo_~~テーブル" & vbLf 9 Set rsW = CurrentDb.OpenRecordSet(strSQL) 10 11 ' 連想配列オブジェクトを宣言 12 Set JsonObject = New Dictionary 13 Do Until rsW.EOF 14 15 strTest = rsW!品名 16 17 JsonObject.Add "material_code", rsW!○○コード 18 JsonObject.Add "shape_code", rsW!□コード 19 JsonObject.Add "surface_code", rsW!××コード 20 JsonObject.Add "product_name",1 21 JsonObject.Add "thick", rsW!2 22 JsonObject.Add "width", rsW!3 23 JsonObject.Add "length", rsW!4 24 25 rsW.MoveNext 26 27 records = records + JsonConverter.ConvertToJson(JsonObject, Whitespace:=2) + "," 28 Debug.Print records 29 JsonObject.RemoveAll 30 Loop

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

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

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

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

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

imihito

2020/03/30 15:23

JsonConverter.ConvertToJsonがどんな処理か知りませんが、JSONとしては一般的な挙動なように思います。 なぜJSONに変換しているのでしょうか?
kuri_dev

2020/03/30 23:29

apiへデータを送る為に変換しております。 また、昨日JsonConverter.ConvertToJsonの関数を調べていたのですが、そこで文字列を変換していたようでした。
guest

回答1

0

ベストアンサー

JSON内の文字は\u16進数四桁という形式でも表記できるため、
"product_name": "SKS2\u677F\uFF7D\uFF77\uFF9D\uFF8A\uFF9F\uFF7D"
はJSONとして有効な文字列です。

そのため「文字化け」というよりはそういう仕様です。

JsonConverterが以下のページのものであれば、作者が英語圏の方であり、
VBAの仕様上ASCII以外の文字はVBEの画面では正常に表示されない可能性があるため、それ以外の文字をエスケープしているのでしょう。

VBA-JSON/JsonConverter.bas at master · VBA-tools/VBA-JSON

「api」というのがJSONを受け取るAPIであれば、普通対応している思うのでそのまま送信してしまえば問題無いでしょう。

参考として、以下の方法でSKS2板スキンパスという文字列が得られます。

javascript

1// ブラウザのコンソールなどで実行 2JSON.parse('"SKS2\u677F\uFF7D\uFF77\uFF9D\uFF8A\uFF9F\uFF7D"')

powershell

1# PowerShellのコンソール上で実行 2ConvertFrom-Json -InputObject '"SKS2\u677F\uFF7D\uFF77\uFF9D\uFF8A\uFF9F\uFF7D"'

投稿2020/04/01 11:36

imihito

総合スコア2166

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

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

kuri_dev

2020/04/01 23:38

こちらの方で、そのまま送ってみてapiサーバ側で問題なくjsonをパースすることが出来ました。 丁寧な解説ありがとうございます。非常に助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問