- ベストアンサー
VBScript ASC関数:文字エンコード(Unicode→Shift-JIS)多対一変換について
- VBScriptのASC関数でShift-JISコード表示時に起こる多対一変換の問題と解決方法について説明します。
- 多対一変換をしないようにするためには、APIのwidechartomultibyte関数の設定を変更することが必要です。
- VBScriptのASC関数と同じ動作をするように関連付けるか、別途プログラムを作成する方法が検討されています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ASC関数の結果をCHR関数で文字に戻して、元の文字と一致しなければ ? にするというのはどうでしょうか。
その他の回答 (1)
- himajin100000
- ベストアンサー率54% (1660/3060)
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を選ぶ。これちゃんとみんなのところに入ってるんだろうか?
お礼
私のPCでは、ADODB.Stream入っていました。 玄人さんですね。 すばらしいです。 具体的にASC関数で不味い事例がわかれば、ベストアンサーでした。 とりあえず、Chr で戻して比較という案でやってみて、何かおきたらこちらの方法に切り替えたいと思います。 とても助かりました。有り難うございます。
お礼
目から鱗でした!! 難しく考えていると 案外簡単な方法を見落としてしまうんですね。。。 とても助かりました。有り難うございます。