(VB6,WinXP,IE8)
こんにちは。
次のサイト、
エコレシピ、北斗晶のおやきハンバーグ、カレー、ビッグライスカツ - 過食・拒食症克服者の簡単ダイエット日記【3ヶ月で15キロ痩せ、摂食障害を克服した秘密】
http://arigatou1000.livedoor.biz/archives/51153318.html
を、IE8(Internet Explorer 8)に表示させて、下のコードを実行すると、
'「参照設定」で「Microsoft Internet Controls」
Dim IE As Object
Dim ShWins As Object
Set ShWins = New SHDocVw.ShellWindows
For Each IE In ShWins
LN = IE.LocationName
Next IE
Set ShWins = Nothing
なぜか、IEのタイトルバーに表示されている「ビッグライスカツ - 」という部分の末尾の「 - 」の3文字の部分が、LNの内容では「???」となってしまいます。
これってどういう現象なのでしょうか?
この文字を表示(例えばテキストボックスに)させるにはどうすればいいでしょうか?
よろしくお願いいたします。
Debug.Print AscW(Mid(LN, 32, 1))
Debug.Print AscW(Mid(LN, 33, 1))
Debug.Print AscW(Mid(LN, 34, 1))
と実行してみれば、その正体がわかるかと思いますよ。
値自体は正しく取得されていますので、表示上の問題ですね。
その 3 文字の正体は、ChrW(&HA0) & ChrW(&H2013) & ChrW(&HA0) です。
HTML ソースを見ると、問題の 3 文字が文字実体参照「 – 」
と表記されていることが見て取れます。
すなわち、これらは Unicode の
… U+00A0 "No-Break-Space"
–… U+2013 "En Dash"
に相当します。
しかし VB6 の Unicode 対応は完全なものではありません。たとえば
MsgBox "『" & ChrW(&HA0) & ChrW(&H2013) & ChrW(&HA0) & "』"
というコードは、VBScript では正しく表示されますが、
VB6 では『???』に文字化けしてしまう事でしょう。
これは日本語環境においては、VB6 の MsgBox、Debug.Print、TextBox等は、
Shift_JIS しか扱えない仕様になっているからです。
魔界の仮面弁士さん、ありがとうございます。
> Debug.Print AscW(Mid(LN, 32, 1))
> と実行してみれば、その正体がわかるかと思いますよ。
> 値自体は正しく取得されていますので、表示上の問題ですね。
AscWを使うべきだったのですか!!!
Ascばかり使っていました。Ascを使うと「?(半角ハテナ)」のアスキーコードである 63 が取得されるばかりだったので、値そのものも取得できてないのかと思っておりました。
実は、表示中のIEのショートカットを作るプログラムを作っていたのですが、
下のようにして、フォルダ「fo」にショートカットを作成したかったのですが、作成されませんでした。
(他のサイトではできました。)
Set WS = CreateObject("WScript.Shell")
Set SC = WS.CreateShortcut(fo & "\" & LN & ".url")
SC.TargetPath = TP
SC.Save
これはやはり「???」の部分が問題になっていると思うのですが、
この場合どうすればショートカットを作成を作成できるでしょうか?
値は正しく取得できているということは、うまく行きそうな気がするのですがなぜか出来ませんでした。
文字列全体から「???」の部分を取り除いたものをファイル名にしようと考えたのですが、そもそも「?」かどうかをどうやって判断すればいいかが分かりませんでした。
VBで扱えない文字を全て一個ずつ調べるのは大変だと思いますし。
度々すいませんがよろしくお願いいたします。
WshURLShortcut も、Unicode 非対応なのだと思います。今回の場合、
Set SC = WS.CreateShortcut(fo & "\" & LN & ".url")
Debug.Print CBool(SC.FullName = fo & "\" & LN & ".url")
は、False を返してきましたから。
> この場合どうすればショートカットを作成を作成できるでしょうか?
今回の文字列に限定していえば、先に空のファイルを作ってしまえば良いようです。
ADODB.Stream や TextStream であれば、Unicode ファイル名を
扱えるようなので、それらを用いて、0 バイトのファイルとして作成しておき、
それをショートファイル名経由で取り扱うようにすると、一応作成できました。
> VBで扱えない文字を全て一個ずつ調べるのは大変だと思いますし。
その大変な方法でも良いのなら、PathGetCharType という API があります。
なお、ファイルシステムによって、使える文字種や文字列長に差異がある点にも注意。
魔界の仮面弁士さん、ご回答ありがとうございます。
> WshURLShortcut も、Unicode 非対応なのだと思います。
そうだったのですか。ユニコードって本当にやっかいですね。
> 今回の文字列に限定していえば、先に空のファイルを作ってしまえば良いようです。
なるほどぉ。TextStreamを使って次のようにすることによって、うまく作成できました。
Set Fso = CreateObject("Scripting.FileSystemObject")
Set FsoTS = Fso.CreateTextFile(Fo & "\" & IE.LocationName & ".url", True)
FsoTS.Write ("[InternetShortcut]" & vbCrLf & "URL=" & IE.LocationURL & vbCrLf)
FsoTS.Close
北斗晶には苦労させられましたが(笑)、おかげさまで解決いたしました。
ゴールデンウィークのなか貴重なお時間をさいていただいて本当にありがとうございました。
> 扱えるようなので、それらを用いて、0 バイトのファイルとして作成しておき、
> それをショートファイル名経由で取り扱うようにすると、一応作成できました。
魔界の仮面弁士さんおっしゃっていたことの意味がよくわかりました。
'まず、空のファイルを作る。
Set Fso = CreateObject("Scripting.FileSystemObject")
Set FsoTS = Fso.CreateTextFile(fName, True)
FsoTS.Close
'次に、短いファイル名でWshURLShortcutを呼んでショートカットを作る。(上書きする)
Set src = Fso.GetFile(fName)
Set ST = objWshShell.CreateShortcut(src.ShortPath)
ST.TargetPath = URL
ST.Save
これで、ショートカットの内容も完全に保存することが出来ました。
ありがとうございました。