投稿者 魔界の仮面弁士  (社会人) 投稿日時 2019/10/29 01:03:21
> Dim length As Integer = System.Text.Encoding.Default.GetCharCount(binary)

ひとつ書き忘れ。
Shift_JIS データの文字数を数えるにあたり、指定したバイナリが
「Shift_JIS としてありえないデータだった場合にどうすべきか」を考える必要があります。


Dim shiftJisBinary() As Byte = ……

があったとして、この配列が指し示す「文字数」をカウントする処理を考えてみます。


Shift_JIS として不正なデータだったらエラーとする場合は ExceptionFallback を使います。

Dim ef = System.Text.EncoderFallback.ExceptionFallback
Dim df = System.Text.DecoderFallback.ExceptionFallback

Dim enc = System.Text.Encoding.GetEncoding("Shift_JIS", ef, df)
Dim length As Integer = enc.GetCharCount(shiftJisBinary)


あるいは、Shift_JIS で表現できないバイト列が混入していた場合において
それをエラーとするのではなく、代替文字で置き換える(いわゆる文字化け)のであれば、
ReplacementFallback を使い、変換失敗時の代替文字を指定します。

Dim ef As New System.Text.EncoderReplacementFallback("⊛") '代替文字を指定
Dim df As New System.Text.DecoderExceptionFallback()

Dim enc = System.Text.Encoding.GetEncoding("Shift_JIS", ef, df)
Dim length As Integer = enc.GetCharCount(shiftJisBinary)



なお、最初の回答に書いた .GetEncoding("Shift_JIS") という指定方法の場合は、
ReplacementFallback が指定されたものとして処理されます。