VBScriptでReplace関数を使った置換について


hoge = "本日は""晴天なり"
fuga = Replace(hoge, """", "?")

と「ダブルクォート」を「?」に置換しようと思ったのですが
Replace関数で「ダブルクォート」の1バイトコードを含んだマルチバイト文字が化けたりする危険はあるでしょうか。

またそういう場合の対処法などがあれば教えて下さい。
文字コードはShift-JISです。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/01/16 22:04:12
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答4件)

id:windofjuly No.1

回答回数2625ベストアンサー獲得回数1149

ポイント34pt

Shift-JISの2バイトコードで使われる範囲は0x40より上なので、
0x22のダブルクォーテーションが原因で文字化けしたりはしないです

id:kodairabase No.2

回答回数661ベストアンサー獲得回数80

ポイント33pt

日本語Windowsで使っている限りはシフトJISを認識しているので、そのような文字化けが起きることはありません。

id:a-kuma3 No.3

回答回数4973ベストアンサー獲得回数2154

ポイント100pt

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 などの文字列操作関数は、バイトじゃなくて、文字単位
id:anesawa

VBScriptは文字単位なんですね。勉強になりました。

2012/01/16 21:59:47
id:taknt No.4

回答回数13539ベストアンサー獲得回数1198

ポイント33pt

Replaceという関数自体が 指定した文字コードで 半角、全角を区別して動くように作られてますので、そのような心配は 不要です。

じゃないと 半角、全角まじりの文字列は 正しく 置換されないことになってしまいますから。

当然、そこらへんは 考慮して 作られてるわけなんです。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません