投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/1/27 17:04:13
> 最終的には以下のプログラムと同じ挙動になるようにしたいです。
このコードの出自はどちらでしょうか?

真偽判定で Or や And を使っていたり、Left や AscB を使っているので、
VB.NET ではなく、VBA や VBScript のコードだとは予想できますが、
参考にされている元ソースの実装が不自然で、コードの意図が読み解けない…。

(可能性1) 元ソースは「AscB(Left(」 ではなく、
 「AscW(Left(」や「Asc(Left(」や「AscB(LeftB(」だった。

(可能性2) 最初の質問にある student_name という変数の中身は、実際には
  student_name = StrConv("テスト セイト", vbFromUnicode)
 に相当する「バイナリ」であった。

(可能性3) 元ソースは、16bit バージョンの Visual Basic だった。

(可能性4) 元ソースでも、受け渡す文字列によっては適切に処理できずに化けることがある。
 (もしくは、化けるような種類の文字列が来ることが無い、という前提条件があった)


> 下記のIF文の処理が読み取れずにいましたが、ASCIIコードとして半角とかどうか判定していたのですね、助かりました。
>> If AscB(Left(chg_kana_name, 1)) >= &HA0 Or AscB(Left(chg_kana_name, 1)) <= &H1F Then
いえ。VBA の AscB 関数は ASCIIコードの値を得るためのものではありません。
渡された文字のバイナリ表現(≠ASCII)の、先頭データを整数で返すだけです。


たとえば、"あ" という文字は
 ASCII では <定義されていない文字>
 Shift_JIS では 82,A0
 UTF-16 では 42,30
 UTF-8 では E3,81,82
なのですが、たとえば、『MsgBox Hex(AscB("あ"))』という処理を実行した場合、
VB2 や VB4(16bit) では "82" 、VB4(32bit)~VB6 や VBA においては "42" と表示されます。

16bit 版 VB(日本語版) では Shift_JIS の先頭バイトの &H82 が返され、
32bit 版 VB では UTF-16 の先頭バイトの &H42 を読み取ることになります。
VBA (32bit/64bit) も UTF-16 相当なので &H42 です。

AscB(Left("テスト", 1)) の場合、先頭の "テ" が検査されて、VBA では &H83 が返されるでしょう。
なお、"テ" の文字を符号化した結果は下記の通り。
 ASCII では <定義されていない文字>
 Shift_JIS では C3
 UTF-16 では 83,FF
 UTF-8 では EF,BE,83


> Dim test As Byte()
> Erase test
> test = System.Text.Encoding.GetEncoding("ASCII").GetBytes(Left(chg_kana_name, 1))
Erase は明らかに冗長であり、下記の一行にまとめられますね。
Dim test = System.Text.Encoding.GetEncoding("ASCII").GetBytes(Left(chg_kana_name, 1))

文字を 1 文字ずつ変換するかわりに、すべてを一括変換することもできます。
Dim test = System.Text.Encoding.ASCII.GetBytes(chg_kana_name)


ところで、"テスト セイト" という 7 文字は、いずれも「ASCII という文字集合」では
定義されていない文字です。そのため、全ての文字が化けてしまい、下記の結果しか得られません。
Dim test As Byte() = { &H3F, &H3F, &H3F, &H3F, &H3F, &H3F, &H3F } '7バイト 


もしもこれを 「JIS コード」として処理するのであれば、こう書きます。
Dim test = System.Text.Encoding.GetEncoding(50222).GetBytes(chg_kana_name)

この場合は下記の結果が得られます。
Dim test As Byte() = { &H0E, &H43, &H3D, &H44, &H0F, &H1B, &H24, &H42, _
                       &H21, &H21, &H0E, &H3E, &H32, &H44, &H0F, &H1B, _
                       &H28, &H42 } '18バイト 


「シフトイン/シフトアウト無しの JIS コード」なら、こうです。
Dim test = System.Text.Encoding.GetEncoding(50221).GetBytes(chg_kana_name)

この場合は下記の結果が得られます。
Dim test As Byte() = { &H1B, &H28, &H49, &H43, &H3D, &H44, &H1B, &H24, _
                       &H42, &H21, &H21, &H1B, &H28, &H49, &H3E, &H32, _
                       &H44, &H1B, &H28, &H42 } '20バイト 


もしも VBA などの動作に揃えるのであれば、「既定のエンコーディング」を使うことができます。
Dim test = System.Text.Encoding.Default.GetBytes(chg_kana_name)

この場合は、日本語環境であれば下記の結果が得られます。
Dim test As Byte() = { &HC3, &HBD, &HC4, &H81, &H40, &HBE, &HB2, &HC4 } '8バイト 



やりたいことの仔細がまだ見えていないのですが、目的に近いのは Default エンコーディングかも…?
For Each c As Char In student_name
    Dim bin As Byte() = System.Text.Encoding.Default.GetBytes(c)

Next


> If test(0) >= &HA0 Or test(0) <= &H1F Then
VB.NET では And/Or ではなく、AndAlso/OrElse を使いましょう。

> w_fullname = w_fullname & "?"
ループ内で文字列連結する場合は、String ではなく StringBuilder を使いましょう。