- PR -

[非 .net] VBAで機種依存文字のチェック

投稿者投稿内容
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-02-10 18:36
引用:

ぢゃん♪さんの書き込み (2004-02-10 18:31) より:
0,1,2‥126,127,-128,-127‥-2,-1
だったりします。


あ!そうですね...
申し訳無いです、ご指摘ありがとう御座います。
これは早速、訂正しておきます。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-02-10 20:49
引用:

はにまるさんの書き込み (2004-02-10 18:12) より:
VBは暗黙変換が定石(って言い切っちゃうとマズイかな?)です。
VB技術者は開発時に、10進数で物事を考え、
その上に、文字の「1」も数値の「1」も一緒なのです。



VBでも、文字の「1」と数値の「1」は別物ですよ。
暗黙変換を定石にしちゃってるからだと思いますが・・・。
そういった定石は捨てた方がいいです。
そこを理解しておかないと、危険です。
とりあえず、文字と数値が一緒だというのは、バグを招きかねない思考なので、周りにそういった技術者がいるとしたら、訂正しておいた方がいいです。

#って随分スレッドからずれたな・・・。

追記:
値を内部的にどう保持しているかを知っておくといいと思います。
試しに敢えてVBでバイナリビューワを作ると理解できるかもしれません。
#って余計なお世話かも・・・。

[ メッセージ編集済み 編集者: NAL-6295 編集日時 2004-02-10 20:52 ]

[ メッセージ編集済み 編集者: NAL-6295 編集日時 2004-02-10 20:53 ]
JW
常連さん
会議室デビュー日: 2004/01/14
投稿数: 49
投稿日時: 2004-02-10 21:18
余計なお世話かもしれませんが、この「機種依存」は、どの程度の厳密さを
求めているのでしょうか。
(Excelとは無関係に)機種依存文字を弾きたい、という話があると、
「Windowsで表示できる機種依存文字」のコードの範囲を調べてソレを弾く
作りにしてしまっているのが多いような気がしますが、できることなら
正当な(JIS X 0201,JIS X 0208で決まっている)文字のSJISでのコードの
範囲を調べて、それ以外を機種依存にしたほうがよりいいのじゃないか、
とか常日頃思えてしまってしょうがありません

また、Excel限定にしてもうまくいかないデータも有りますね。
・オートコレクトが効く状態(標準)で、(c),(r),(tm)などを入力
・(Windows2000/XPで?) IMEからUnicodeにしかない文字を選択して入力
・その他、Unicodeが表示できるアプリからのコピー&ペースト
などの方法を使うことにより、Unicodeにしか無い文字をExcel上に入力できます。

ASC関数の定義が怪しいですが、
(少なくともExcel2000では) Unicodeにあり、SJISに無い文字の扱いは
・アクセント記号つきの英字など、基本の文字がある場合
→ アクセント記号無しの英字が返る
・その他
→ 0x3F(10進で63)、"?"の文字コードが返る
ようです。
# まあ WindowsAPIのUnicode関連の関数はそんなもののような気もします。

そんなデータを考慮するのであれば、
・Asc()の結果が 0x20(32)〜0x7F(127) で AscW()の結果が 0x80(128)〜0xFF(255)の場合
・Asc()の結果が 0x3F(63) で AscW()の結果が 0x3F以外の場合
も、機種依存扱いでいいような気もします。
# そんなデータ入れないか…。

JW
常連さん
会議室デビュー日: 2004/01/14
投稿数: 49
投稿日時: 2004-02-10 21:27
引用:

・Asc()の結果が 0x20(32)〜0x7F(127) で AscW()の結果が 0x80(128)〜0xFF(255)の場合
・Asc()の結果が 0x3F(63) で AscW()の結果が 0x3F以外の場合



そこまで狭めなくても
・Asc()の結果が 0x20(32)〜0x7F(127) で AscW()の結果が 0x20〜0x7Fではない場合

でよかったような…
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-02-10 21:58
はにまるです。
引用:

NAL-6295さんより:
VBでも、文字の「1」と数値の「1」は別物ですよ。


ごめんなさい、一緒だと言い切っていますね...
「同一視されている事が多い」が適切ですね。

ご指摘ありがとうございます。
これもまた訂正

引用:

暗黙変換を定石にしちゃってるからだと思いますが・・・。
そういった定石は捨てた方がいいです。
そこを理解しておかないと、危険です。
とりあえず、文字と数値が一緒だというのは、バグを招きかねない思考なので、周りにそういった技術者がいるとしたら、訂正しておいた方がいいです。


パートナーさんに質問してみました。やっぱり理解していない...
お伝えすると、「ま〜VBですから関係無いでしょ、後テストもしますし」って...
それ以上、何も言えなかった..というか言う気がしなかった..TT
(これパートナーさん見てたら誰か、ばれるな!)

引用:

#って随分スレッドからずれたな・・・。


ごめんなさい、ずらしてしまいました。
ただ、私に取って結構、お勉強になりました。(教育には気を付けよ!)
皆様、ありがとうございます。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-02-10 22:27
引用:

はにまるさんの書き込み (2004-02-10 21:58) より:
パートナーさんに質問してみました。やっぱり理解していない...
お伝えすると、「ま〜VBですから関係無いでしょ、後テストもしますし」って...
それ以上、何も言えなかった..というか言う気がしなかった..TT
(これパートナーさん見てたら誰か、ばれるな!)




超蛇足ですが、
double型の0.0001を1万回足したら何になるか質問して見てください。
1と言ったら危険です。

#ってこれこそ余計なお世話ですね。

[ メッセージ編集済み 編集者: NAL-6295 編集日時 2004-02-10 22:31 ]
りばぁ
大ベテラン
会議室デビュー日: 2003/11/26
投稿数: 130
お住まい・勤務地: 愛知県
投稿日時: 2004-02-11 01:44
こんばんわ。
確かに話がそれていますが^^;

>暗黙変換を定石にしちゃってるからだと思いますが・・・。

これはやっぱりまづいですね。出来るからやっちゃえみたいなのは・・

あと、突っ込む人がいなかったので。

VBには文字列型が存在しますが、Cには文字列型はありません。
あるのは文字配列です。似てるようで、違う・・・らしい(ぉ

あと、はにまるさん、なにやら難しく考えていらっしゃるようですが、
まず最初に大切なことは、コンピュータは0か1の数値しか扱えないということです。
どんな言語であろうと、メモリ上に文字自体が書き込まれるはずはなく・・・

で、もう少し具体的に(じゃないかも)、signed と unsignedの使い道ですが

コード:
signed char c1;
unsigned char c2;
c1=255;
c2=-128;



とかすると怒られます(たぶん、、、あえてやるものじゃないので
ためしてもないですが^^;)

たまーに、必要なことがあるんですよね・・・

※なんだか適当ですみません^^;
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2004-02-11 12:00
はにまるさん、こんにちは。

#話題がどんどんずれていく...。

引用:

お伝えすると、「ま〜VBですから関係無いでしょ、後テストもしますし」って...


VBだから問題なんですよね〜。で、大体、テストでは問題なくても、実運用で問題が発生してしまうという...。

ありがちなのが、こういう↓パターン。
コード:
Dim a, b, c
a = "1"
b = "2"
c = (a + b) * 2



それと、はまりやすいのが、文字列を返す関数。
ほとんどの場合、戻り値が内部処理形式 String の Variantだったりするので、例えば Left$()とかMid$()とか、明示的に戻りの型を指定しないと思わぬところで躓いてしまいます。
以前、データを加工してファイルに出力する処理をやっていた知り合いが、「訳のわからん制御文字がデータに含まれてしまう」と言って悩んでいましたが、原因はこの手の関数のせいで、書き込むデータが意図せず Variant 型となってしまった為でした...。

スキルアップ/キャリアアップ(JOB@IT)