
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関数
と同じ動きをするように関連付けるか、別途プログラム
を作る方法がわからず困っています。
わかる方いらしたら、ご教授下さい。
よろしくお願い致します。
No.2ベストアンサー
- 回答日時:
ASC関数の結果をCHR関数で文字に戻して、元の文字と一致しなければ ? にするというのはどうでしょうか。
目から鱗でした!!
難しく考えていると
案外簡単な方法を見落としてしまうんですね。。。
とても助かりました。有り難うございます。
No.1
- 回答日時:
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 で戻して比較という案でやってみて、何かおきたらこちらの方法に切り替えたいと思います。
とても助かりました。有り難うございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EBCDIC⇒SJIS変換の方法
-
文字の変換 select case
-
コーディングが悪いというのは?
-
PS4コントローラーをPCでゲーム...
-
DOHCとOHC
-
Excelで入力禁止文字を設定したい
-
濁点(゙) 半濁点(゚)を一文字と数...
-
TV出力ポートをOFFにすれば良い...
-
cout と cerrの違い
-
デスクトップPCでWQHD出力させたい
-
4Kの外部モニターに出力すると...
-
Msgboxで表示できる文字数の上...
-
Googleスプレッドシートでワイ...
-
棒グラフ 横軸の縦書き2列にし...
-
VBの「As String * 128」とは?
-
変数内に入った文字列の結合 UWSC
-
VBA フォームのテキストボック...
-
Microsoft365で作ったword文書...
-
メモ帳の置換機能で特定の文字...
-
RS232cデーターをエクセルに落とす
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EBCDIC⇒SJIS変換の方法
-
std::stringからLPCWSTR型への変換
-
セル内の文字列が日本語か英語...
-
「彡」って文字はなんという文...
-
VS 2008(VB.NET)
-
COBOLによる全角・半角混...
-
ふりがなをアルファベット化す...
-
Symfowareでのデータ型変換につ...
-
RubyでUTF8のコード値を文字に...
-
フォームのコントロールのバッ...
-
%fと%gについて
-
ExcelVBA実行後に時々落ちる
-
JIS → S-JIS コード変換するには
-
英数字を含む文字列(0-9,A-Z)...
-
sedで日本語の置換方法について
-
byte配列の内容をstringにコピ...
-
数字5桁文字コード?
-
accessでJISコードを求める関数
-
コード変換について
-
「髙(はしごたか)」を文字コー...
おすすめ情報