Thanks a lot, jamex(亲亲吾爱),非英文字符是指中文,日文等和其它一些特殊字符.我注意了些字符是双字节的,但还是乱麻.

解决方案 »

  1.   

    http://www.csdn.net/expert/topic/537/537285.xml
    看一下这里,
      

  2.   

    Text1.Text = Text1.Text & VBA.StrConv(VBA.StrConv(LoadBytes, vbFromUnicode), vbUnicode)
      

  3.   

    Private Sub Command1_Click()
       Dim b(10) As Byte
       b(0) = &HE7
       b(1) = 0
       b(2) = &HE8
       b(3) = 0
       b(4) = &HE9
       b(5) = 0
       Text1.Text = Text1.Text & VBA.StrConv(VBA.StrConv(b, vbFromUnicode), vbUnicode)End Sub
    text1中&HE7还是显示不出来
    api画是没问题,但不知道怎么让控件也可以显示
      

  4.   

    这个问题有两个办法:
    1、从存储到读取上解决。采用UniCode存储就可以了。2、现行文件以GB2312存储。所有Ascii大于127(扩展码)的都是汉字的半角。而小于128并大于31的都是可以显示的英文字符。对于GB2312的问题,可以采用奇偶累加办法来解决。当第一次遇到扩展码时,开始计算奇偶。遇到偶数则将两个字节完整拼为一个。但问题是VB内以UniCode显示汉字,所以还要做代码转换。对于一个现成的文件,应当采取定义相似类型的方式读为String。而你自己设计二进制文件则要把字符串自行转换成Byte数组。以下程序就是专门把字符串转换成Byte数组的程序,兼容中文,而且提供了转换回来的函数。Function StringGetByBytes(pBytes() As Byte) As String
      'StringGetByBytes函数
      '语法:tOutString=StringGetByBytes(pBytes())
      '功能:从Byte数组获得字符串[兼容中文]
      '参数:pBytes()   保存字符串的Byte数组。
      '返回:tOutString Byte数组中保存的字符串。
      Dim tOutStr As String
      Dim tLoop As Integer
      Dim tByteLen As Integer
      
      tByteLen = UBound(pBytes)
      
      For tLoop = 0 To tByteLen
        tOutStr = tOutStr & ChrB(pBytes(tLoop))
      Next
      
      StringGetByBytes = tOutStr
    End FunctionFunction BytesGetByString(ByVal pString As String, pBytes() As Byte) As Integer
      'StringGetByBytes函数
      '语法:[tOutInt=]BytesGetByString(pString, pBytes())
      '功能:将字符串保存到数组[兼容中文]
      '参数:pString    被保存的字符串。
      '      pBytes()   保存字符串的Byte数组。
      '返回:tOutString Byte数组的元素数量。
      Dim tStrLength As Integer
      Dim tLoop As Integer
      Dim tCodeStart As Byte
      
      tStrLength = LenB(pString)
      
      For tLoop = 1 To tStrLength
        tCodeStart = AscB(MidB(pString, tLoop, 1))
        ReDim Preserve pBytes(tLoop - 1)
        pBytes(tLoop - 1) = tCodeStart
      Next
      
      BytesGetByString = tStrLength
    End Function
      

  5.   

    读取:
    Dim TempFile As Long
    Dim LoadBytes() As ByteTempFile=FreeFile
    Open 文件名 For Binary As #TempFile
    Redim LoadBytes(1 To Lof(TempFile)) As Byte
    Get #TempFile,,LoadBytes
    Close TempFileText1.Text=StrConv(LoadBytes,vbUniCode)写入:
    Dim TempFile As Long
    Dim SaveBytes() As ByteSaveBytes=StrConv(Text1.Text,vbFromUniCode)TempFile=FreeFile
    Open 文件名 For Binary As #TempFile
    Put #TempFile,,SaveBytes
    Close TempFile
      

  6.   

    谢谢,KiteGirl(小仙妹),我试着运行了你的代码,但StringGetByBytes函数还是不能正常转换中文等字符。而且BytesGetByString函数中的 ReDim  Preserve  pBytes(tLoop  -  1)有错误。请问你能试试,再把问题告诉我好吗?非常感谢!
      

  7.   

    BytesGetByString在我的函数库里是一个低级函数,它不具备容错能力。所以很容易出错误。ReDim Preserve pBytes(tLoop-1)的错误可以用以下措施预防:pString 至少要有一个字符
    pBytes()必须是动态数组
    pBytes()必须至少有一个元素(用ReDim声明为pBytes(0))下面的方法可以预防这种错误的产生。
    Dim tTestStr As String
    Dim tTestBytes() As Byte
    ReDim tTestBytes(0)
    If CBool(Len(tTestStr)) Then
      BytesGetByString tTestStr,tTestBytes()
    End If另外你可以在调试状态测试:
    1、pBytes()是不是数组
    2、pBytes()有几个元素(如果参数数组没用ReDim定义至少有1个元素。那就可能出错了)
    3、tLoop的值是否大于0另外需要说明的是:我提供给你的函数不能把其他格式的字符串的Byte正确转换成字符串。只有把字符串用上面的函数转换成Byte数组保存,才可以用上面的函数转换回来。  如果你想把一个现成的格式的文件的字符串读取出来那要用Type语句定义和这个文件相似的字段类型才可以。另外需要注意的是VB在保存字段字符串的时候有个Bug,假如你定义一个String * 12的子变量,而实际上这个变量占用24Byte的空间,但是只保存12Byte的信息。后面的12Byte是死区,无法操作。这个Bug体现在写操作上,但不影响读。
      我上面提供的函数就是解决这个问题的一个临时办法。