IEのLocationNameが「???」となってしまいます

解決


高木  2009-05-04 05:29:19  No: 101701  IP: 192.*.*.*

(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の内容では「???」となってしまいます。

これってどういう現象なのでしょうか?
この文字を表示(例えばテキストボックスに)させるにはどうすればいいでしょうか?

よろしくお願いいたします。

編集 削除
魔界の仮面弁士  2009-05-04 20:01:39  No: 101702  IP: 192.*.*.*

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 しか扱えない仕様になっているからです。

編集 削除
高木  2009-05-05 00:53:08  No: 101703  IP: 192.*.*.*

魔界の仮面弁士さん、ありがとうございます。

> 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で扱えない文字を全て一個ずつ調べるのは大変だと思いますし。

度々すいませんがよろしくお願いいたします。

編集 削除
魔界の仮面弁士  2009-05-05 02:31:40  No: 101704  IP: 192.*.*.*

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 があります。

なお、ファイルシステムによって、使える文字種や文字列長に差異がある点にも注意。

編集 削除
高木  2009-05-05 12:56:13  No: 101705  IP: 192.*.*.*

魔界の仮面弁士さん、ご回答ありがとうございます。

> 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

北斗晶には苦労させられましたが(笑)、おかげさまで解決いたしました。
ゴールデンウィークのなか貴重なお時間をさいていただいて本当にありがとうございました。

編集 削除
高木  2009-05-05 15:04:22  No: 101706  IP: 192.*.*.*

> 扱えるようなので、それらを用いて、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

これで、ショートカットの内容も完全に保存することが出来ました。
ありがとうございました。

編集 削除