VB引用Fso不管事,直接open ... as #1乱码请问如何正确读取高手指点

解决方案 »

  1.   

    读完后   用strconv 转换一下不可以吗
      

  2.   

    二进制方式读到byte数组(忽略文件头的两字节编码标志),然后赋给字符串
      

  3.   

    就用fso可以了,open文件的时候用unicode方式打开,不会出现乱吗,不过你的文件必须是unicode 的文件。OpenTextFile()函数使用时将最后一个参数设为TristateTrue
      

  4.   

    很久很久没于写过VB代码了,不知道写得对不对,参考一下吧
    Open strSourFile For Binary Access Read As #1
    ReDim buffer(LOF(1) - 1) As Byte
    Seek(1,3)
    Get #1, , buffer
    Dim str As String = buffer
      

  5.   

    Be careful to use strconv,it may has variable returns on English Windows or 95/98/NT/XP.
      

  6.   

    就用fso可以了,open文件的时候用unicode方式打开,不会出现乱吗,不过你的文件必须是unicode 的文件。OpenTextFile()函数使用时将最后一个参数设为TristateTrue
    ---------------------------------------------------------------------------------回复这个方法,对大部分的unicode编码,能正确显示,但是f8e1这个码位(是超出GBK表示极限的)
    Dim zz As TextStream
    Dim str
    Set zz = Fso.OpenTextFile("e:\zz.txt", ForReading, , TristateTrue)
    str = zz.ReadAll 或 richtextbox=zz.ReadAll
    zz.Close
    他读进来后还显示问号,即使直接赋给richtextbox也显示问号,但是如果在richtextbox框上,进行手动的输入,则显示正确,邪门VB能把所有的unicode表示的码,都认出来吗?上述的这些意见,对大部分的unicode码,管用,但是
    请试一下f8e1这个码位 ,用eudcedit.exe在这个码上,造个字,肯定是问号??????有其他方法吗?
      

  7.   

    f8e1这个码位的确存在严重问题!我以前也试过
    你试试用Byte数组读,然后用Strconv转换或者直接赋给string 看看可以吗
    不行就只好用api转了
      

  8.   

    API转
    是用WideCharToMutiByte和MutiByteToWideChar吗??
    我式过这两个,还是不行,如果用byte读unicode格式的txt文件,码位肯定读的正确
    但是,显示问号??对此有兴趣的高手
    请试一下f8e1这个码位 ,用eudcedit.exe造字程序在这个码上,造个字,显示出来肯定是问号
    ?????waiting......
      

  9.   

    是不是oracle不支持所有的unicode字符,只支持那些gbk转过来的unicode字符?????
      

  10.   


    VB有没有这样一个功能?????
    比如
    msgbox "\uf8e1" 这个语句是假设的
    功能是显示f8e1这个字,而不是“f8e1”怎样实现这种功能???有哪位高手在VB编程环境里,显示f8e1这个码位的文字,正确。
    ????请大家试试,很邪门。
    难道我是第一个提这种问题的???高手捧场
      

  11.   

    整些啥?
    Strconv即可不知道是哪种编码怎么转换?你那句里的\是麻语言里字符转换的操作符吧
      

  12.   

    我来结帖了!!
      '*************************************************************************
    '**FunctionName:DecipherFile
    '**Input       :strEncryptFilePath(String)  -File Path which has been Encrypted
    '**            :strDecipherFilePath(String) -File Path which will Save Decipher Code
    '**OutPut      :bytNewData() -Decipher Code
    '**Description :Decipher File which was Encrypted  and made a new DecipherFile
    '**Global Var  :bytNewData
    '**Author      :YongJun-Zou
    '**Data        :2007-01-15 14:52:56
    '**Version     :V1.0.0
    '*************************************************************************
    Public Sub DecipherFile(strEncryptFilePath As String, strDecipherFilePath As String)
        On Error GoTo ToExit '打开错误陷阱
        '------------------------------------------------
        Dim bytData()       As Byte 'Save File Data
        Dim lngLoop         As Long 'For Loop
        Open strEncryptFilePath For Binary As #1
        ReDim Preserve bytData(LOF(1) - 1) As Byte
        Get #1, 1, bytData 'Get Data from File
        Close #1
        For lngLoop = 0 To UBound(bytData)
            Select Case bytData(lngLoop)
                Case 11, 14
                    bytData(lngLoop) = bytData(lngLoop) - 2
                Case 10, 13  'vbCrLf
                    bytData(lngLoop) = bytData(lngLoop)
                Case 0
                    bytData(lngLoop) = 255
                Case Else   'Normal
                    bytData(lngLoop) = bytData(lngLoop) - 1
            End Select
        Next
        ReDim bytNewData(UBound(bytData)) As Byte
        Call CopyMemory(bytNewData(0), bytData(0), UBound(bytData) + 1)
             
      'Save a File that is Decipher Code
    '    If Dir(strDecipherFilePath) <> "" Then Kill strDecipherFilePath
    '    Open strDecipherFilePath For Binary As #1
    '    Put #1, 1, bytData   'Write New File which has been Deciphering
    '    Close #1
        
        '------------------------------------------------
        Exit Sub
        '----------------
    ToExit:
        Debug.Print "Error Data:" & Format(Now, "YYYY-MM-DD HH:MM:SS")
        Debug.Print "Error Type:" & Err.Number
        Debug.Print "ErrorDescription:" & Err.Description
        Debug.Print "ErrorSource:" & "DecipherFile"
        Debug.Print "SystemTitle:" & "Form1"
    End Sub
      

  13.   

    试完不能结帖我上面提过,open 文件名...    as #1 ,这种读二进制方法,读出来的码位是正确的
    但是,把它赋给变量后,他显示的文字,有正确的,有不正确的,
    尤其是F8e1这个unicode码位或其附近的,老是显示问号你上面的这段代码,我总结为copyfile 源文件,目标文件有其他方法吗?
    以前有这方面的提问吗?
    am i number one ??
      

  14.   

    我想在编程环境里,显示f8e1这个unicode码位所代表的字,是显示字,想把这个字入库
    数据库有的支持,有的不支持,也很邪门。****************************************************
    VB有没有这样一个功能?????
    比如
    msgbox "\uf8e1" 这个语句是假设的
    功能是显示f8e1这个字,而不是“f8e1”
    ****************************************************这条语句是我瞎写的,我是想说,VB有没有这种功能,在.net 中,“\u”+码位,是显示文字,而不是显示“码位”字符串,VB有这种类似的功能吗?
      

  15.   

    我也遇到这个问题,open as 出现乱码,主要是由于各字符的编码不同引起的。
    我查这不少文章,说window的编码是unicode.
    而系统的编码好像是GB3212
    但如果原字符串是非GB3212编码的,如繁体、utf8。
    等,系统显示就会出现乱码!主要是中文乱码!
    实际上问题在于各编码的转换!第二、open方法后input读取也存在分字串和字节读取二类。字串读取我没试过。
    但字节读取就会出现问题。
    如果字节读取出现乱码,可用strconv转换,转成unicode还原!
    如果是繁体编码:则用strconv这样转:繁体——unicode——GB3212
    相反也成!(有人做过这样的函数,但我没测试)按这样的原理:UTF8——unicode——GB3212
    转换也应可以,但我却不知道如何转!这就是我的问题
    大家知道的话给指点一下!
      

  16.   

    没有办法解决..我做的时候直接用字节数组.
    只要用 dim a as string 再赋值肯定会出错.不光这一个码位.无可奈何的vb
      

  17.   

    是用造字程序 eudcedit.exe自己造的字
      

  18.   

    看了你的帖很多天,还没解决,我就试了一下。可以呀,在Textbox和RichEdit中都可以看到。问题有可能是你没正确用eudcedit.exe,先选中F8E1--〉然后画--〉Save Character--->Font Links to link with all Font.
      

  19.   

    因为你造的字在自己的电脑里,所以只能本机显示。
    当然你可以Copy你所造字体到其他的电脑里去显示。
    说明:测试环境:XP (English)/SP2,VB6 (En) SP6.我用的是我自编的 DLL/TLB Extend Unicode TextBox和Unicode RichEdit (using CreateWindowExW)。
      

  20.   

    '''''''''''''''''''''''''''''''''''''''''''''''''
    因为你造的字在自己的电脑里,所以只能本机显示
    '''''''''''''''''''''''''''''''''''''''''''''''''这句话正确,但是如果换一台机器
    他的确是显示不出来,但是他绝不应该显示问号??用记事本保存 你unicode格式,你再试试举例
    a.txt  保存为unicode格式
    内容是
    “我们”如果“我”是造的字的话
    在其他机器上则应显示“ 门”  应以空格替代,而不应是问号可以试试
      

  21.   

    如果“我”是造的字的话
    在其他机器上则应显示“ 门” 应以空格替代,而不应是问号答:在你假设的条件下,“我”在其他机器上则显示一个小框,不是问号(你说的对,不是“?”)。问题是a.txt是Unicode或UTF-8文件吗?如果你Save成ANSI,那肯定是奇怪的乱码了。
      

  22.   

    如果“我”是造的字的话
    在其他机器上则应显示“ 门” 应以空格替代,而不应是问号答:在你假设的条件下,“我”在其他机器上则显示一个小框,不是问号(你说的对,不是“?”)。问题是a.txt是Unicode或UTF-8文件吗?如果你Save成ANSI,那肯定是奇怪的乱码了。
      

  23.   

    reply “我”在其他机器上则显示一个小框那是因为,f8e1这个字,你save的时候用ansi了在你save之前,肯定提示什么有unicode,保存丢失什么的。用unicode存就行,utf-8我没试过。
      

  24.   

    “我”在其他机器上则显示一个小框,不是问号(你说的对,不是“?”)
    注意:在其他机器上(没有安装你创建的字符),则显示一个小框,在本机显示正确,为你所创建的字。
    (完,不在回答,good luck!)
      

  25.   


    Public Function UnicodeFile_Read_VB(ByVal sFileName As String) As StringDim FF As Long
    Dim b() As Byte
    Dim s As StringConst uBOM As String = "ÿþ"On Error Resume NextFF = FreeFile
    Open sFileName For Binary Access Read As FF
    ReDim b(LOF(FF))
    Get FF, , b
    Close FF
    If b(0) = 255 And b(1) = 254 Then
    s = b
    Else
    s = StrConv(b, vbUnicode) 'ANSI file
    End IfUnicodeFile_Read_VB = sEnd FunctionPublic Sub UnicodeFile_Write_VB(ByVal sFileName As String, _
    ByVal vVar As String, _
    Optional ByVal bInsertBOM As Boolean = True)Dim FF As Long
    Dim b() As ByteOn Error Resume Next
    Kill sFileName
    On Error GoTo 0
    FF = FreeFile
    Open sFileName For Binary Access Write As #FF
    If bInsertBOM Then
    ReDim b(1)
    b(0) = &HFF
    b(1) = &HFE
    Put #FF, , b
    Erase b
    End If
    b = vVar
    Put #FF, , b
    Close #FF
    End Sub