投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/1/26 21:41:23
> 最終的には以下のプログラムと同じ挙動になるようにしたいです。
そのプログラムが、どういう挙動を意図したものなのか、読み取れないです…。

目的によっては、正規表現を使って切り出せるかもしれません。
https://dobon.net/vb/dotnet/string/ishiragana.html

あるいは Shift_JIS 限定の文字列を前提としているような場合は、
Dim enc = System.Text.Encoding.GetEncoding(932, EncoderFallback.ExceptionFallback, DecoderFallback.ExceptionFallback)
Dim binary As Byte() = enc.GetBytes(yourString)
などとして、元の文字列をまとめてバイナリ化できますので、そこから判断できるかもしれません。
(ExceptionFallback は、Shift_JIS で使えない文字をエラー扱いにするためのものです)


> 全角と半角及び送信不可文字を判別したいのですが
目的を教えてください。それらは『何のために』判別しようとしているのでしょうか?

というのも、全角/半角の定義というのは前提条件によって異なるためです。
送信不可文字の定義も然りです。さらに言えば
文字集合(charset)と符号化方式(encoding)の組み合わせにもよります。

たとえば iso-2022-jp エンコードな 7bit の text/plain メールにおいては、
"セ" という文字は機種依存文字として送信できないことになっていますが、
utf-8 エンコードな 8bit の text/plain メールであれば送出できます。
また、iso-2022-jp の 7bit メールであっても、text/html なメールであれば、
実体参照符号という仕組みを使うことで問題なく扱えます。

.NET の世界の文字集合は Unicode ですが、これも「ゼロ幅文字」や「結合文字」の
存在があるため、どうしても曖昧さが生じます。あるいは昔ながらの Shift_JIS であっても、
タブ文字や LF 文字を、半角とみなすか全角とみなすかは処理系依存です。

可読文字に限定した場合で考えてみても、たとえば罫線文字の "┣" は、
Windows 2000 の "メモ帳" の既定のフォント "MS ゴシック" では全角幅で描画されますが、
Windows 11 の "Windows コンソール" の既定のフォント "Cascadia Mono" では半角幅です。
いずれのフォントも、等幅の TrueType フォントであり、半角/全角いずれも間違いとは言えません。

Unicode の世界においては、EAST_ASIAN_WIDTH という文字幅情報が定義されているため、
これが判断条件に使われる処理系も多いです。これは、日中韓といった
東アジアの DBCS 混合幅文字エンコーディングへのマッピングの互換性のための情報で、
各文字が下記 6 種のいずれかに分類されています。

 F (Fullwidth)      全角。"¦" や "!" や "8" や "ヴ" や "a" や "$" や "₩" や "¢" など。
 H (Halfwidth)      半角。"│" や "ウ" や "₩" や "ᆭ" など。
 W (Wide)           ワイド。"❕" や "八" や "ウ" や "㏾" や "㌆" や "쪄" や "🤣" など。
 Na(Narrow)         ナロー。"|" や "!" や "$" や "8" や "{" や "¢" など。
 A (Ambiguous)      文脈依存。"│" や "∜" や "⑧" や "α" や "∀" や "🄉" など。
 N (Not East Asian) ニュートラル文字。"‼" や "Å" や "➑" や "ힰ" や "🤻" や "⁸" や "₈" など。



https://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt
https://www.unicode.org/reports/tr11/tr11-40.html