重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

VBScript ASC関数:文字エンコード(Unicode→Shift-JIS)多対一変換について

初めての質問です。
よろしくお願いいたします。

【質問】
VBScriptのASC関数で文字をShift-JISコード
表示した場合、多対一変換され、文字変換が起こります。
この多対一変換をしないように、もし対応する文字が無い場合は、
?になるようにしたいと思いますが、良い方法は無いでしょうか?

【現象】
ラテン1補助のÀ文字(A`)の
UnicodeとSift-JISコードのマップ対応が原因のようです。

具体的には、Àは、
Unicodeでは(A`)だが、Sift-JISコードでは(A)
にマップされているのです。
IMEパッドの文字コードをみるとわかります。

以下のサイトを見ると、さらに詳しく載っています。

▼参考サイト
第7回 Unicodeからの多対一の変換[前編]
http://gihyo.jp/admin/serial/01/charcode/0007


そこで、APIのwidechartomultibyte関数の
wc_no_best_fit_charsを設定したエンコード方式
を使用すれば解決するというところまでは、
わかってきたのですが、これをVBScriptのASC関数
と同じ動きをするように関連付けるか、別途プログラム
を作る方法がわからず困っています。


わかる方いらしたら、ご教授下さい。

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

A 回答 (2件)

ASC関数の結果をCHR関数で文字に戻して、元の文字と一致しなければ ? にするというのはどうでしょうか。

    • good
    • 0
この回答へのお礼

目から鱗でした!!

難しく考えていると
案外簡単な方法を見落としてしまうんですね。。。

とても助かりました。有り難うございます。

お礼日時:2010/10/04 20:33

Function IsValidChar(s1, encoding)


Dim s
Dim obj
If Len(s1) <> 1 Then
Err.raise
End If
Set obj = createObject("ADODB.Stream")
obj.Open
obj.Charset= encoding
obj.WriteText(s1)
obj.Flush()
obj.Position = 0
s = obj.ReadText(-1)
obj.Close()
If s <> s1 Then
isValidChar = False
Exit Function
End If
isValidChar = True
End Function

Sub Main()

Dim src
Dim dst
Dim i

src = "あいう?abc"
dst = ""
For i = 0 to Len(src) - 1
If IsValidChar(Mid(src,i + 1,1),"Shift_JIS") Then
dst = dst & Mid(src,i + 1,1)
Else
dst = dst & "?"
End If
Next

Msgbox(dst)

End Sub

Main()

'Windows APIを調べるのが面倒なので
'一文字ずつ地道にチェック。
'個人的にASC関数があまり好きではない。多分デフォルトの符号化方式に頼っているあたり。(なんかASCWとASCを比較する人が出そうだなぁ)
'なので、俺はADODB.Streamを選ぶ。これちゃんとみんなのところに入ってるんだろうか?
    • good
    • 0
この回答へのお礼

私のPCでは、ADODB.Stream入っていました。

玄人さんですね。
すばらしいです。


具体的にASC関数で不味い事例がわかれば、ベストアンサーでした。
とりあえず、Chr で戻して比較という案でやってみて、何かおきたらこちらの方法に切り替えたいと思います。

とても助かりました。有り難うございます。

お礼日時:2010/10/04 20:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!