再次请教,vb写入ini文件,有汉字存在乱码的问题,接上一贴
有几位老师说了,是汉字少时,不能正确识别编码格式的问题,我试了试,的确是这样,
用word打开,会提示选择字符集,我选择gb2312打开就能正常显示汉字了.
而记事本无法用gb2312字符集打开文本文件,所以无法正常显示,用editplus也可以用gb2312字符集打开.
记事本默认是以UTF-8格式打开的.但我还是不太明白,
我的程序写入INI文件,总不能因为汉字少,就会出现乱码吧.如何实现不管汉字多少,都能以UTF-8格式显示呢?
因为VB处理字符串,本来就是用UNICODE编码处理的呀,为何汉字少了,还必须要用GB2312编码格式来打开呢?另外,不解是:我的文件显示不正常,为何VB自已却能正确的识别出汉字呢?

解决方案 »

  1.   

    http://www.pcworld.com.cn/how_to_use/1/2006/0619/6552.shtml
    参考此文和以前在记事本里输入“联通”变成方框的事情,是记事本的BUG造成的原理是,记事本可以打开ANSI、UTF-8、Unicode等格式的文件。而为了方便和兼容性,记事本在开发的时候“智能”的判断此文本到底是以什么编码格式存储,然后用相应的格式读取,此时,就会出错。再详细点讲,一般的ANSI编码格式没有特殊的标识,而UTF-8格式会在最前面有EFBBBF三个字节的标识,以识别为UTF-8格式的文本。但是,为了能正常的打开一些以UTF-8格式存储,而前面未加三个字节标识符的文件,记事本在打开的时候做了一些运算,这些运算的BUG导致了打开的时候文件变成乱码。就以“联通”的事情来举例,新建一个记事本,输入联通二字,保存,再打开,变成乱码。
    用WinHEX查看它的十六进制为C1AACDA8,它是无标识符的ANSI格式文本。
    但是由于算法上的BUG,记事本将其认为是无标识符的UTF-8格式文本,打开的时候经过了转换,于是就变成了乱码。
    验证此说法的方法也很简单,点击另存为,可以看到编码那里默认的格式就是UTF-8。而你用一个ANSI格式的文本打开并点另存为,默认格式是为ANSI。此时我将里面的乱码删除,输入“波导终结者”五个字,直接点保存,然后用WinHEX打开,看到十六进制为
    EFBBBFE6B3A2E5AFBCE7BB88E7BB93E88085
    前面的EFBBBF就是UTF-8的BOM(具体是啥请自行搜索),将EFBBBF三个字节删除,保存,再用记事本打开该文件,“波导终结者”五个字仍能正常显示,也就是我前面说的“记事本兼容了无BOM的UTF-8编码”。当你使用strconv(str,vbwide)后,字符串已经被转换成了Unicode格式,此时保存再打开就没有刚才提到的问题(Unicode的编码方法不同,没有BOM的问题,具体的一时半会讲不清楚,请自行搜索)。你用十六进制编辑器打开保存过的文本就知道了,编码是不一样的。 
    经过试验,我纠正我刚才的一些错误第一,strconv(str,vbwide)并不是将字符转换为unicode,而是宽字符,而输出的文本仍然是ANSI。你导出后打开,没有发现后面的数字和字母都变成全角宽字符了吗?
    之所以用strconv(str,vbwide)输出再打开不会变成乱码,还是记事本的BUG。由于算法有缺陷,在文本内容为ANSI的“豫CD12345”时,记事本可以正确的识别其格式,而为“豫CD12345”时错误地识别为无BOM的UTF-8第二,unicode也是有BOM的,FFFE,Unicode big endian为FEFF第三,strconv(str,vbunicode)乱码是必然的,简单来说,UTF-8编码下,一个汉字占三字节,而unicode下和ANSI一样仍是二个字节,所以无BOM的unicode文件记事本无法识别,统一认为是ANSI。用strconv(str,vbunicode)转换成 unicode字符串再写入文本,因为没有BOM,记事本必然将其认为是ANSI编码,肯定乱码。至于解决办法,看你需要的应用到底是什么,如果一定要用记事本读,而且完全不要乱码,可能就得自己转码然后加上BOM写入。非要我复制过来
      

  2.   

    这么说,如果这个ini文件就是我自已用,我自已的程序保存,自已的程序读取,我就不用管编码格式了,只要能自已读出来就行了.
    是这样吗?
      

  3.   

    与记事本猜编码不同,ini 读写始终用默认编码进行 Unicode/Ansi 转化,这通常是控制面板的区域设置决定。
    只要你始终在中文系统上用,就没问题。
      

  4.   


    始终用默认编码进行 Unicode/Ansi 转化
    这是什么意思?
      

  5.   

    ini 中保存的是 Ansi 或者说 DBCS 编码,同样的内容用 gb-2312 或 big-5 之类转化为 Unicode 的结果是不同的,这就是“乱码”产生的原因。简体中文系统为 gb-2312,“联通”用 gb-2312 转化为 Ansi、再反过来用 gb-2312 转化为 Unicode 还是“联通”。两个转化用的编码必须一致。
      

  6.   

    要么弄清unicode与ansi的差别,要么将汉字进行一定处理之后,比如ascii码存储到ini中。
      

  7.   


    视觉显示和编码保存是两回事。ini 的目的,是用编码保存信息。至于打开它的第三方软件是否能正确显示,如果你不需要,就不必介意。当然,你也可以将你的汉字内容先转化成 Unicode 编码,再保存。如果它不仅仅要显示在你的软件里,而且是一些识别编码,则可以在读回之后再转成 ANSI 码。不过,我总觉的这样做是画蛇添足。
      

  8.   

    我不理解的是,VB 本身就是按UNICODE处理字符呀,这是我刚学VB时就知道的.
    现在才知道,并不是按UNICODE格式保存,再次问问,VB是以哪种格式保存的呢?ANSI,不会吧.ANSI是单双字节混合编码呀.
      

  9.   

    就是ANSI,你打开VB输出的文本再点另存为就知道了
      

  10.   

    我现在也在学习 INI 类的写法 不过看上去好复杂