VbStrConv.Narrowでエラーが出ます。 への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 るきお  (社会人)
投稿日時
2021/8/10 15:39:49
.NET 5 でしょうか?
とりあえず、エラーメッセージに書いてある RegisterProviderメソッドがヒントで、下記のようにすれば、実行はできます。
何かエラーが発生している場合は、できましたら、コピー&貼り付けすればすぐにこちらでもエラーが再現できるプログラムを投稿していただけるとお互い時間の節約になると思います。
なお、投稿されているプログラムはいわゆるサロゲートペアの文字には対応できないようですのですのでご注意ください。
また、一般的なケースでは文字列の幅を取得するには MeasureString が使用できます。
とりあえず、エラーメッセージに書いてある 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 においてカルチャが文字列に与える影響」でエラーが出るということのようですが、どうすれば良いのでしょうか。
下記の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
意味は良く分かりませんでしたが、貼り付けてみたところエラーは出ず、
無事に動くようになりました。
もとのプログラムも昔にこちらで教えていただいたVB6のものと思います。
その説もありがとうございました。
使用目的は、あるCADから使用できるプログラムの為でして、
全角、半角の区別は厳密にはそのCADのプログラムによっていますので、
違いがでるかもしれません。CADではMS ゴシックが使われています。
MeasureStringは、スクリーンとか印刷で使われていると思いましたが、
そのCAD上では、文字列の扱いでは無く、1文字1文字を配置して表示、印刷される仕様だと思いますので、このような処理が必要となっていました。
重ねて、ありがとうございました。