VbStrConv.Narrowでエラーが出ます。 への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 英人  (社会人) 投稿日時 2021/8/10 16:04:36
るきお様、ありがとうございます。
意味は良く分かりませんでしたが、貼り付けてみたところエラーは出ず、
無事に動くようになりました。

もとのプログラムも昔にこちらで教えていただいたVB6のものと思います。
その説もありがとうございました。

使用目的は、あるCADから使用できるプログラムの為でして、
全角、半角の区別は厳密にはそのCADのプログラムによっていますので、
違いがでるかもしれません。CADではMS ゴシックが使われています。

MeasureStringは、スクリーンとか印刷で使われていると思いましたが、
そのCAD上では、文字列の扱いでは無く、1文字1文字を配置して表示、印刷される仕様だと思いますので、このような処理が必要となっていました。
重ねて、ありがとうございました。


投稿者 るきお  (社会人) 投稿日時 2021/8/10 15:39:49
.NET 5 でしょうか?
とりあえず、エラーメッセージに書いてある RegisterProviderメソッドがヒントで、下記のようにすれば、実行はできます。
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance)

Dim result As String = StrConv("ア", VbStrConv.Narrow)


何かエラーが発生している場合は、できましたら、コピー&貼り付けすればすぐにこちらでもエラーが再現できるプログラムを投稿していただけるとお互い時間の節約になると思います。

なお、投稿されているプログラムはいわゆるサロゲートペアの文字には対応できないようですのですのでご注意ください。

また、一般的なケースでは文字列の幅を取得するには MeasureString が使用できます。
投稿者 (削除されました)  () 投稿日時 2021/8/10 15:39:44
(削除されました)
投稿者 英人  (社会人) 投稿日時 2021/8/10 13:15:34
お世話になります。
下記のm = Len(StrConv(Mid(str, i, 1), VbStrConv.Narrow))
の位置で
「System.NotSupportedException: 'No data is available for encoding 932. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method.'」
というエラーで出ます。
VbStrConv.Narrowが「Visual Basic においてカルチャが文字列に与える影響」でエラーが出るということのようですが、どうすれば良いのでしょうか。


  Public Function m_len(ByVal str, ByVal mW, ByVal md) As Double
        Dim i As Integer
        Dim m As Integer
        ' str:文字列 mw:jwis全角文字幅 md:jw文字間隔 curScale:書き込みレイヤスケール 
        Dim test = System.Text.Encoding.Default
        For i = 1 To Len(str)
            m = Len(StrConv(Mid(str, i, 1), VbStrConv.Narrow))
            If m = 1 Then '半角の場合 
                m_len = m_len + mW / 2 '半角文字の幅を加えて 
                If i <> Len(str) Then m_len = m_len + md / 2 '文字間隔の半分を加える 
            End If

            If m = 2 Then '全角の場合 
                m_len = m_len + mW 'is全角文字の幅を加えて 
                If i <> Len(str) Then m_len = m_len + md '文字間隔を加える 
            End If
        Next i
        m_len = m_len * curScale
    End Function