分数不够,可以再加
有一个unicode文件,里面有一些西欧字符
现在要把读出来,用对话框显示
我用了下面一段程序,但是出问题,很多字符不能正常显示
请大家帮忙
 Dim TempFile As Long
Dim LoadBytes() As Byte
TempFile = FreeFile
Open "d:\codeTEST.txt" For Binary As #TempFile
ReDim LoadBytes(1 To LOF(TempFile)) As Byte
Get #TempFile, , LoadBytes
Close TempFile's 01 = StrConv(LoadBytes, vbFromUnicode)  MsgBox (LoadBytes)
其中关闭掉的那一行也不起什么作用,显示的字符还没有关闭后显示得多
请问应该怎么设置,是否loadbytes不对,应当设置为双子节的数据类型
vc中能够解决,可是vb中怎么解决呢?

解决方案 »

  1.   

    或者说我想试试用双字节的字符书组的来解决这个问题
    怎么定义这个双字节的数组呢?
    我是用vc的,vb不熟,望大家帮忙!
    谢谢
      

  2.   

    MsgBox (StrConv(LoadBytes, vbUniCode))
      

  3.   

    读:
    Dim TempBytes() As Byte
    Open 文件名 For Input As #1
    TempBytes = InputB(LOF(1), #1)
    Close #1
    Text1.Text = StrConv(TempBytes, vbUnicode)写:
    Open 文件名 For OutPut As #1
    Print #1,Text1.Text
    Close #1
      

  4.   

    你的代码中
    TempBytes = InputB(LOF(1), #1)
    什么意思呢?
    看不懂
    下面这句代码是转换为unicode字符吗?
    究竟要转换成什么样的字符?才能正确显示呢?
    Text1.Text = StrConv(TempBytes, vbUnicode)
      

  5.   

    都说比二该次的vb能编写vc下的任何程序,为什么这个都不能实现呢?
      

  6.   

    InputB是VB6的函数(VB4就有了)
      

  7.   

    VB的String是基于Unicode的
    而一般的文本文件是基于ANSI+DBCS的
    所以需要用StrConv转换vbUnicode:将ANSI+DBCS的Byte数组转为Unicode的String
    vbFormUnicode将Unicode的String转为ANSI+DBCS的Byte数组
      

  8.   


    Input 函数
          返回 String,它包含以 Input 或 Binary 方式打开的文件中的字符。语法Input(number, [#]filenumber)Input 函数的语法具有以下几个部分:部分 描述 
    number 必要。任何有效的数值表达式,指定要返回的字符个数。 
    filenumber 必要。任何有效的文件号。 
    说明通常用 Print # 或 Put 将 Input 函数读出的数据写入文件。Input 函数只用于以 Input 或 Binary 方式打开的文件。与 Input # 语句不同,Input 函数返回它所读出的所有字符,包括逗号、回车符、空白列、换行符、引号和前导空格等。对于 Binary 访问类型打开的文件,如果试图用 Input 函数读出整个文件,则会在 EOF 返回 True 时产生错误。在用 Input 读出二进制文件时,要用 LOF 和 Loc 函数代替 EOF 函数,而在使用 EOF 函数时要配合以 Get 函数。注意 对于文本文件中包含的字节数据要使用 InputB 函数。对于 InputB 来说,number 指定的是要返回的字节个数,而不是要返回的字符个数。
      

  9.   

    其实你的文件是按照ascii方式保存的否则可以直接读出来
    因为你需要StrConv(str, vbUnicode)
    转化一下
      

  10.   

    你们的方法感觉还是不行
    我把文件发到这个邮箱,你们动手看一下,和你们想象的不一样的
    [email protected]
    pwd:sun_programmer
    etang的免费用户
      

  11.   

    你把文件发到[email protected]帮你看看呢.
      

  12.   

    不好意思,没有收到,请重发一次.
    或发至 [email protected] 也可
      

  13.   

    如果阁下能够用VC搞定的话,以下这个的功能是跟VC一样的;我自己的测试也是成功的:
    Private Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As Long, ByVal lpCaption As String, ByVal wType As Long) As LongPrivate Sub Form_Load()
        Dim TempFile As Long
        Dim LoadBytes() As Byte
        
        
        TempFile = FreeFile
        Open "c:\xvidcore.ini" For Binary As #TempFile
        ReDim LoadBytes(1 To LOF(TempFile)) As Byte
        Get #TempFile, , LoadBytes
        Close TempFile
        MessageBox 0, VarPtr(LoadBytes(1)), "", 0
    End Sub
      

  14.   

    vc当然解决了,那是最开始的问题,我把vc做好的发上去你们看
      

  15.   

    文件放在这个ftp
    FTP下载账号:test 
    FTP下载密码:test 
    地址:test.qyeee.com
      

  16.   

    那个txt是什么格式的?ANSI还是Unicode?你在VC是怎么处理的?
    是你自己没讲清楚,耽误时间是当然的
      

  17.   

    vc里面设置unicode环境;然后用双字节的字符数组来存放读入的内容
    然后可以直接显示
    可是我vb不会,不知道该怎样定义这种结构体来解决这个问题
    就是定义双字节的字符数组,来存放读入的二进制数据
    你有办法么?
      

  18.   

    是MsgBox的问题(VB调用的是MessageBoxA,不支持Unicode)
    Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)Private Declare Function MessageBoxW Lib "user32" (ByVal hWnd As Long, ByVal lpText As Long, ByVal lpCaption As Long, ByVal wType As Long) As LongPrivate Sub Command1_Click()
        Dim hFile As Integer
        Dim TempBytes() As Byte
        hFile = FreeFile()
        Open "c:\downloads\codetest.txt" For Binary As #hFile
        ReDim TempBytes(1 To LOF(hFile))
        Get hFile, , TempBytes
        Close hFile
        
        'MsgBox TempBytes
        
        Dim TempStr As String
        TempStr = String(UBound(TempBytes) \ 2, vbNullChar)
        CopyMemory ByVal StrPtr(TempStr), TempBytes(1), UBound(TempBytes)
        'MsgBox TempStr
        'MessageBoxW Me.hWnd, StrPtr(TempStr), StrPtr(Me.Caption), 0
        
    End Sub
      

  19.   

    copy错了
    将“'MessageBoxW Me.hWnd, StrPtr(TempStr), StrPtr(Me.Caption), 0”去掉注释先前调试时注释的,忘了恢复
      

  20.   

    非常感谢
    非常感谢
    非常感谢
    zyl910(910:分儿,我又来了!) ( ) 
    问题解决了,哈哈哈,谢谢
    马上准备结账,给你300分(100分另开目录)
    因为还有100分要给其他热心的人
    等一下你再会我的贴子,看到后请huifu
      

  21.   

    zyl910(910:分儿,我又来了!) ( )
       CopyMemory ByVal StrPtr(TempStr), TempBytes(1), UBound(TempBytes)
    这句话中strptr是个什么东西呢?怎么没有定义呢?抱歉我vb不会;不定义也可以么
    还有最后一句中
     'MessageBoxW Me.hWnd, StrPtr(TempStr), StrPtr(Me.Caption), 0
    vb中使用的是Me这个参数么?就是父窗口的指针么?和vc中很不一样阿
    呵呵;解释一下好么?
    我马上再开贴子
      

  22.   

    strptr是VB的隐藏函数
    用于得到字符串的数据的地址
    me是指当前类模块(窗口模块也是类模块)
      

  23.   

    zzy1910:
     http://expert.csdn.net/Expert/topic/2164/2164081.xml?temp=.4780237
    此贴先给你结100分。这个等到讨论完再结分。顺便考虑一下再文本框里面怎么
    做.
    夜草:
      我们顺便也考虑一下,文本况钟怎么样解决!大家都是学点东西,分不够我可以再加
    我不小气的!
      

  24.   

    给你一个笨方法,绝对能放到文本框中:Dim TempFile As Long
    Dim LoadBytes() As Byte
    Dim value As Long
    Dim Ii As Integer
    Dim result As StringTempFile = FreeFile
    Open "e:\codeTEST.txt" For Binary As #TempFile
    ReDim LoadBytes(1 To LOF(TempFile)) As Byte
    Get #TempFile, , LoadBytes
    Close TempFileresult = ""
    '头两个字节(FF FE)是Unicode文件标志
    For Ii = 3 To UBound(LoadBytes) Step 2
        value = LoadBytes(Ii) + LoadBytes(Ii + 1) * 256&
        result = result & ChrW(value)
    Next  MsgBox result
      

  25.   

    Edit是Windows系统提供的控件
    MFC只是把它封装成了类
    (VB封装成了TextBox,只不过只封装了ANSI版的)
      

  26.   

    写好了
    http://www.fantasiasoft.net/Zyl910/SDK_Edit.zip