VBScript(WSH)で発生する『改行』や『〜(全角チルダ)』などの変換問題の解決法
- 2020.09.17
- WSH/VBS備忘録
- VBScript, Windows10, WSH, エラー改善, スクリプト備忘録, 全角チルダ問題, 変換, 失敗例, 情報収集, 改行コード問題, 自作システム
VBScript(WSH)で発生する『改行』や『〜(全角チルダ)』などの変換問題の解決法
現在VBScriptで楽天市場の店舗情報(特にTrackingデータ)を取得するスクリプトを書いています。
そんな中で大いに悩んだことが2つ出てきました。
- <br>の改行をReplaceしているのにCSVに吐き出すと次の行にレコードが入ってきて表がずれる
- 全角チルダ(~)で書かれたパーツがあるとCSVに吐き出しでエラーになる
共に文字コードの問題。
特に後者の全角チルダは根深い問題なのだそうです。
というかね、その前に全角チルダなんて記載した覚えないんだけど…個人的には波ダッシュを入れているつもりだったのよ。何故に全角チルダになってるの…。
まずは項目2の解決方法から
今回はこんな方法で解決しました。
VBScriptのファイルのエンコードを『Shift_jis』から『UTF-16LE』に変更
ファイルのエンコードを変更すると解決する理由
『~(全角チルダ)』の問題はShift_jisが全角チルダを認識しない事に由来します。
根本原因は【該当する文字コードが存在しない】からなのだそうです。
だったら波ダッシュと誤認して勝手に処理してくれればいいのですが、スクレイピングするWebサイト側はutf-8で記載されている事が多く、Shift_jis上で波ダッシュをReplaceしてねと命令しても無視されてしまいます。
私が色々やって泥沼に入ってしまったのはMsgBoxで書き出してあげるとしっかり[ ~ ]が入るから。
だったら認識まで出来ているのだからReplaceだってできるだろうとやってみて、結局半日費やしてもダメでした。
全角チルダを認識するエンコードで動かせばなんも問題なくね?
Shift_jisで書いていてReplace(hoge,”〜”,”~”)と書いても「全角チルダは(認識できないから)保存すると消えてしまいます」と言われてしまいます。だから、この全角チルダを「文字コード」にしてReplaceすればと思うわけですけど、そもそも「文字コード」が無いからエラーが発生しているわけで…。
だったら認識できるエンコードで書けばいけんじゃね?と。
発想の転換ですよね。
で、これは見事にはまりました。
思いつくまで半日以上かかりましたけどね。
VBScriptは『Shift_jis(ASIN)』と『UTF-16LE』で動かせる
全角チルダ以外にもShift_jisで問題が起こる文字があります。
文字 | SJIS | Unicode(Unix) | Unicode(Windows) |
---|---|---|---|
~(全角チルダ) | 無い | U+FF5E | 無い |
~(波ダッシュ) | 0x8160 | U+301C | U+FF5E |
-(全角マイナス) | 0x817C | U+2212 | U+FF0D |
∥(平行記号[双柱]) | 0x816B | U+2016 | U+2225 |
¢(セント) | 0x8191 | U+00A2 | U+FFE0 |
£(ポンド) | 0x8192 | U+00A3 | U+FFE1 |
¬(ノット) | 0x815C | U+00AC | U+FFE2 |
こんな風に文字コードが無かったり、文字コードが異なるのが問題になる様です。
『-(全角マイナス)』は意図せず登録している可能性あるかも…。
改行処理で発生した困った文字コードの違い
その改行は『\n』『\r\n』『\r』どれでしょう
1 2 3 4 |
Dim dTime dTime = objIE.getElementsByTagName("td")(0).innerText dTime = Replace(dTime,vblf,"") |
こんなコードを書いていたのですが、CSVに出力したデータに何故か改行が入り四苦八苦していました。
CSVで改行が適用されてしまった理由
Windowsで書かれたコードだと改行コードは \r\n となっています。
じゃあ.innerTextで取得した場合<br>は何に置き換わってる??
WEB上のコードはこれらの改行コードが混在している事が多々あります。
\r = vbCr = Chr(13)
\n = vbLf = Chr(10)
\r\n = vbCrLf = Chr(13) + Chr(10)
今回私に起こっていた原因は \n改行と \r\n改行が混在していたため起こりました。
もうね、こんなコード書いたりして迷走しましたよ。
1 2 3 4 5 |
'文字列 "\n" を置換しようとしています。改行の変換にはなりません dTime = Replace(dTime,"\n","") '\n という書き方がそもそもエラーで動きません dTime = Replace(dTime,\n,"") |
これどちらも動きません。(当たり前ですけど)
どんなコードで改行してるかわからなければ全て置換してしまえばよい
1 |
dTime = Replace(Replace(Replace(dTime,Chr(13) + Chr(10),""),Chr(10) ,""),Chr(13) ,"") |
こんな風に全部処理させてしまえば意図しない改行で困る事はなくなります。
まとめ
まさかこんな立て続けに文字コードでハマるとは思いませんでした。
特に『全角チルダ問題』は困った。
でもいい勉強になりました。これだけ疲れる経験すれば記憶に残りますからね。
-
前の記事
VBScriptで書くセレクトボックスのプルダウン選択肢の選択方法 2020.09.15
-
次の記事
VBScript(WSH)で外部Functionを呼出して戻り値を受ける方法と注意点 2020.09.18
コメントを残す