You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

解决思路及修正代码

  1. 问题本质:Chr()函数在.NET环境中默认依赖系统当前的默认编码,新版环境可能默认使用UTF-8,而UTF-8中128-190的字节属于无效的单字节序列,导致无法生成有效字符;注册代码页提供器后,Chr()仍未关联到指定的Windows-1252编码,因此数组为空。

  2. 解决方案:显式使用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
  1. 说明:
  • 注册CodePagesEncodingProvider是为了在.NET Core/.NET 5+环境中能获取到Windows-1252这类非默认编码(.NET Framework中通常无需此步骤,但兼容添加也无问题)。
  • 使用GetString()方法直接基于指定编码将字节转换为字符,确保128-190的数值对应到Windows标准扩展ASCII字符,避免依赖系统默认编码的不确定性。

内容的提问来源于stack exchange,提问作者brynM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 22:16:03