VB.NET字符串数组存储128以上字符报错问题求助
VB.NET 128以上扩展ASCII字符处理问题解决思路
旧版VB.NET程序中,通过Chr(I)生成128到190范围内的字符能正常工作,这些字符对应Windows标准扩展ASCII(如Windows-1252编码)。但在新开发环境中直接使用该代码会报错,尝试注册代码页提供器后错误消失,但生成的字符串数组却为空。
原始报错代码
Public QAZ, conv As String Public SREP(200) As String Public I, J As Integer Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click For I = 128 To 190 SREP(J) = Chr(I) J = J + 1 Next End Sub
尝试修改后的代码(错误消失但数组为空)
Public SREP(200) As String Public I, J As Integer Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance) J = 0 For I = 128 To 190 SREP(J) = Chr(I) J = J + 1 Next End Sub
解决思路及修正代码
问题本质:
Chr()函数在.NET环境中默认依赖系统当前的默认编码,新版环境可能默认使用UTF-8,而UTF-8中128-190的字节属于无效的单字节序列,导致无法生成有效字符;注册代码页提供器后,Chr()仍未关联到指定的Windows-1252编码,因此数组为空。解决方案:显式使用Windows-1252编码将字节转换为字符,替代
Chr()函数:
Public SREP(200) As String Public I, J As Integer Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click ' 注册代码页提供器(确保能获取Windows-1252编码) System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance) Dim win1252Encoding As System.Text.Encoding = System.Text.Encoding.GetEncoding("Windows-1252") J = 0 For I = 128 To 190 ' 将字节转换为Windows-1252对应的字符 SREP(J) = win1252Encoding.GetString(New Byte() {CByte(I)}) J = J + 1 Next End Sub
- 说明:
- 注册
CodePagesEncodingProvider是为了在.NET Core/.NET 5+环境中能获取到Windows-1252这类非默认编码(.NET Framework中通常无需此步骤,但兼容添加也无问题)。 - 使用
GetString()方法直接基于指定编码将字节转换为字符,确保128-190的数值对应到Windows标准扩展ASCII字符,避免依赖系统默认编码的不确定性。
内容的提问来源于stack exchange,提问作者brynM
相关产品推荐
相关产品推荐

