如何读取一个UNOCODE文件?为何该文件的头两个字节为FF FE?读出来到变量中为乱码?
另外string 类型的变量存储字符串的长度有限制吗?

解决方案 »

  1.   

    可能的话给段读文件(UNICODE)的代码
      

  2.   

    string长度没有限制的,
    ff fe是unicode文本的标志,
    如果没有,一般的编辑器就认为这个文件是ansi文本文件
      

  3.   

    写程序是应该先检查有没有这个标志
    有,就应该seek两个字节,然后用unicode的方式读取,
    否则,seek开始位置,然后用ansi的方式读取
      

  4.   

    FF FE 是BSBOM标记(U+FEFF)
    专用于描述Unicode文本的编码格式FF FE:表示是UTF-16LE编码
    FE FF:表示是UTF-16BE编码
    FF FE 00 00:表示是UTF-32LE编码
    00 00 FE FF:表示是UTF-32BE编码
    EF BB BF :表示是UTF-8编码
    这是由于一般的txt文件是ANSI+DBCS编码的
    而Unicode又有很多种编码格式
    所以需要几个表示编码格式的字节来区分编码格式
      

  5.   

    String最多可包含大约 20 亿 ( 2^31)个字符
      

  6.   

    另外string 类型的变量存储字符串的长度有限制吗?
    -------------------------------------------理论上可以达到4G个字符
    实际上最大只可能是 (1G-4M)-1 个字符
    (与BSTR的定义有关)
      

  7.   

    “String最多可包含大约 20 亿 ( 2^31)个字符”
    from MSDN,实际不晓得不太明白,请教zyl910
    //理论上可以达到4G个字符
    //实际上最大只可能是 (1G-4M)-1 个字符
    //(与BSTR的定义有关)BSTR是Unicode,双字节的,应该是2G才对,不明白为什么实际少了那么多?
      

  8.   

    这与Windows的虚拟地址空间设计有关高2G是系统内存区
    最低4MB是DOS兼容区
    2GB-4MB是系统保留区
    所以只有2GB-8MB的地址空间才能放数据再加上BSTR是UTF-16LE格式的字符串
    每个字符2Byte(没使用代理对的时候,使用代理对就是4byte了)
    所以还要除2最后-1是因为String最后又一个隐含的'\0'字符串结束符
      

  9.   

    ...然后用unicode的方式读取,
    否则,seek开始位置,然后用ansi的方式读取读取有区别吗,有代码没?
      

  10.   

    对于UTF16LE:dim bbuf() as byte
    dim cbfile as long
    dim hf as integerhf = freefile()
    open [文件名] for binary as hf
    cbsize = lof(hf)
    if cbsize>2 then
    cbsize = cbsize - 2
    redim bbuf(0 to cbsize-1)
    get hf, , bbuf
    end if
    close hftext1.text = bbuf  '会自动转为String,String的数据就是byte()