人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

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

●質問者: anesawa
●カテゴリ:コンピュータ インターネット
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● うぃんど
●34ポイント

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


2 ● kodairabase
●33ポイント

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


3 ● a-kuma3
●100ポイント

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

anesawaさんのコメント
VBScriptは文字単位なんですね。勉強になりました。

4 ● きゃづみぃ
●33ポイント

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

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

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

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ