hoge = "本日は""晴天なり"
fuga = Replace(hoge, """", "?")
と「ダブルクォート」を「?」に置換しようと思ったのですが
Replace関数で「ダブルクォート」の1バイトコードを含んだマルチバイト文字が化けたりする危険はあるでしょうか。
またそういう場合の対処法などがあれば教えて下さい。
文字コードはShift-JISです。
http://charset.7jp.net/sjis.html
これは、Shift_JIS の文字コード表です。
「シフトJISの2バイトコード(全角文字)のエリアマップ」です。
行方向が「区」で、漢字 2byte の上位の方を表します。
列方向が「点」で、漢字 2byte の下位の方を表します。
例えば、「本日は」の「本」は、「区」=96、「点」=7b で、967b になります (16進表記)。
ダブルクォートは、コードが 22 (16進表記) なので、Shift_JIS が表す「点」の範囲に入っていません。
じゃあ、「下位バイトが 40以上 だったら、文字化けの心配があるのか?」ってことが気になりますよね。
多分、anesawa さんは C言語、もしくは Perl の経験があって、文字列がバイトの配列、というイメージがあるのだと思います。
VBScript は、文字列を扱うときには、バイトの集まりではなく、文字の集まりとして扱っているので、
そもそも「漢字の下位バイトがどうなっているから...」ということを心配する必要がありません。
文字列を操作する関数でも、文字の位置や長さは、バイトでは無くて、文字単位です。
逆に、「文字列の 4バイト目のコードは何?」みたいな処理をする方が頭を使います。
以下のコードは、質問のコードを、下位バイトが "}" (コードは 7d) の漢字にしてみたものです。
実際に動かしてみれば、正しく処理されているのが確認できると思います。
hoge = "凡党は}晴天なり" ' 「凡 (967d)」、「党 (937d)」、「} (7d)」 fuga = Replace(hoge, "}", "?") WScript.echo fuga WScript.echo mid(hoge, 2, 1) ' mid などの文字列操作関数は、バイトじゃなくて、文字単位
Replaceという関数自体が 指定した文字コードで 半角、全角を区別して動くように作られてますので、そのような心配は 不要です。
じゃないと 半角、全角まじりの文字列は 正しく 置換されないことになってしまいますから。
当然、そこらへんは 考慮して 作られてるわけなんです。
VBScriptは文字単位なんですね。勉強になりました。
2012/01/16 21:59:47