投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/1/27 19:47:20
※文章を書いているうちにるきおさんと被ってしまいましたが、構わず投稿しちゃいます。(^^;

> やりたいことはstudent_name に入る文字列を1文字づつ半角全角を判定して、全角なら「?」に変換という処理を想定していました。
> 元ソースの環境は恐らくVB6で私の環境がVB.NETなのでAscB関数が使えなく、同じ挙動になるにはどうすればいいかわからなかったので質問させていただきました。
> 最初に書くべきでした、申し訳ございません。
そうですね。それを最初に書いていただけると、状況を掴みやすかったです。

で、その元ソースはどうやって入手したものですか?
VB6 だとしても、AscB と Left の組み合わせというのはちょっと不自然なので、
そもそも、移植元のソース自体にも何らかの問題を抱えている可能性も否めない…。


> 元ソースがどの文字コードを使っているかは不明だったので、Default エンコーディングで試してみようと思います。
> Default エンコーディングなんてあったのですね・・・。
.Default もしくは .GetEncoding(0) は、「OS の既定のコードページ」を意味します。

日本語環境であれば、コードページ932 (Shift_JIS 相当)になり、
簡体字中国語ならば、コードページ936 (GB2312 相当)になり、
繁体字中国語ならば、コードページ950 (Big5 相当)になります。



> 例えば「タナカ タロウ」なら「TANA? TA?U」という感じです。
 「タナカ タロウ」ならば「TANA? TA?U」だと思いますが
「タナカ タロウ」なので「TANA??TA?U」ではありませんか?


また、そうしたアルファベット変換を行う前に、プログラム側で
全角/半角を揃えておくといった事前作業は行われないのでしょうか。

Dim student_name = "タナカ タロウ"
'"タナカ タロウ" 
Dim han_student_name = StrConv(student_name, VbStrConv.Narrow Or VbStrConv.Katakana, &H411)
'"タナカ タロウ" 
Dim zen_student_name = StrConv(student_name, VbStrConv.Wide Or VbStrConv.Katakana, &H411)



そもそも、「アルファベットに変換」するための fnc_chg_Kana の実装内容も気になります。
変換というのがローマ字相当だとしたら、ちょっと無理がありませんか? 提示頂いたコードだと、
 fnc_chg_Kana(Left(chg_kana_name, 1))
のように 1 文字ずつ渡しているように見えますが、
半角カナの場合「゙」や「゚」が渡されることもあるわけですよね。
"ハハ"   → "HAHA"
"ババ" → "BABA"
"パパ" → "PAPA"



いわゆる『ローマ字』だとすれば、その表記は以下 3 種(あるいはその派生形)に分類されますが、
いずれも一文字単位では変換できないはずです。
 (1) ヘボン式 … ジ=JI、ヂ=JI、ヂャ=JA 、チ=CHI、ヲ=O
 (2) 日本式  … ジ=ZI、ヂ=DI、ヂャ=DYA、チ=TI 、ヲ=WO
 (3) 訓令式  … ジ=ZI、ヂ=ZI、ヂャ=ZYA、チ=TI 、ヲ=O

※学校教育で教えるのは 訓令式(とヘボン式)

撥音「ン」の変換ルールの問題もありますよね。
駅名表記(ヘボン式)の場合は、
 新宿 → shi N juku  ※唇を開いて発音する「ン」は N
 新橋 → shi M bashi ※唇を閉じて発音する「ン」は M
のように、次に続く文字が M, B, P の時は N ではなく M になるルールであり、
これを実装するには、1 文字ずつではなく、文字列全体を渡す必要があるはずです。