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

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

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

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

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

文字コード

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

Q&A

解決済

1回答

10454閲覧

ADODB.Streamを利用した文字コード変換例(VBA)ついて教えてください

SatoshiM

総合スコア12

VBA

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

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

文字コード

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

0グッド

0クリップ

投稿2017/12/22 09:19

編集2017/12/23 07:22

昨日、こちらで質問したhttpリクエストによる全件取得はおかげさまで実行できたのですが、対象がSHIFT-JISでエンコードされていて、このままでは使えません。

そこで、ググってみると以下のような文字コード変換関数例が見つかりうまくコード変換できました。

しかし、ここが良く分かりません

convTextEncoding = Mid(convText, 3, Len(convText))

なぜ、3桁目から切り取るのでしょう。これを外すとまた文字化けします。

また、エラー時の

convTextEncoding = StrConv(text, vbUnicode, 1041)

も良く分かりません。

最後に、処理の順序についてですが、通常開いて、読み込んで、書き込むイメージでおりましたが、こちらは

.Charset = toCharaset
.WriteText text

で書いてから

convText = .ReadText()

読み込んでいます。

重要なデータなので取りこぼすことはできません。アドバイスといいますか解説お願いいたします。
引用元はこちらです。

' 概要 ' 引数で渡された text の文字コードを変換する関数 ' 引数 ' text : 変換前の文字列 ' fromCharaset : 変換前の文字コード ' toCharaset : 変換後の文字コード(default : unicode) ' 戻り値 ' 変換後の文字列 ' Private Function convTextEncoding(ByVal text, ByVal fromCharaset As String, Optional ByVal toCharaset As String = "unicode") Dim convText As String With CreateObject("ADODB.Stream") .Open .Type = adTypeText .Charset = toCharaset .WriteText text .Position = 0 .Type = adTypeText .Charset = fromCharaset On Error GoTo myLabel convText = .ReadText() convTextEncoding = Mid(convText, 3, Len(convText)) On Error GoTo 0 End With Exit Function myLabel: convTextEncoding = StrConv(text, vbUnicode, 1041) End Function

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

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

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

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

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

guest

回答1

0

ベストアンサー

多分ですがUTF-8のBOMというものがあり先頭3バイトに文字コードの内容を判別するものがありそれを省くためにやっているものと推測します。
通常UTF-8かどうか判断して3文字目から切るか最初から切るか判断するはずなのですが、参考にされたコードにはそこら辺が書いてなかったようですね。

投稿2017/12/22 09:41

sousuke

総合スコア3828

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

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

SatoshiM

2017/12/23 07:17

回答ありがとうございます。切り取らずに保存したものをバイナリエディタで確認すると"FFFE"が入っていました。 以下を参照させてもらうと、BOMも複数あるようですね。 http://exlight.net/devel/unicode/bom.html この辺も勘案して convTextEncoding = StrConv(text, vbUnicode, 1041) が入っているんでしょうか。 しかし、せっかくのWebシステムなのになんでShift-JISなんだと(以下略)
sousuke

2017/12/25 01:20

StrConv(text, vbUnicode, 1041) はエラー時の処理なので正直うまくいくのかどうかわかりません。 StrConvの第3引数は「ロケールID」で数値リテラル「1041」は「ja(日本)」を指すようですね。 前投稿の回答でもStrConvが出ていたと思いますが本来は第3引数を指定しなくてもシステムのロケールIDを使うそうなので「1041」として多分変換していると思います。 web側がSJISなのは…諦めるしか無いですね(^_^;)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問