CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  基础类

读TXT文件,读出的中文都是乱码,请高手来解决!!!!!!!!!

楼主glc20022003(哈哈)2006-01-16 13:34:40 在 VB / 基础类 提问

我的VB打的是SP6补丁,TXT文件中的一行是  
  "1                                   新华南园1号101室                                                           6           6           020060111"  
  而我line   input出来的却是  
  "1                                   鏂板崕鍗楀洯1鍙?01瀹?                                                         6           6           020060111"  
   
  我读别的TXT文件都可以显示中文,就读这个TXT文件出现乱码,请高手帮忙解决一下,谢谢了!!! 问题点数:50、回复次数:15Top

1 楼vansoft(Vansoft Workroom)回复于 2006-01-16 13:53:27 得分 0

把这个文件另存一下,保存的文件格式重新设置一下。Top

2 楼zou19820704(天下英雄)回复于 2006-01-16 13:59:43 得分 0

不明白Top

3 楼glc20022003(哈哈)回复于 2006-01-16 14:00:37 得分 0

To:vansoft(Vansoft   Workroom  
        关键是这个文件是别人电脑软件自动生成的,我要每次都要把里面字符串里的值解析出来写到自己的SQL数据库中去.还有别的好的方法吗???Top

4 楼faysky2(出来混,迟早是要还嘀)回复于 2006-01-16 14:01:40 得分 5

这样试试:  
  Private   Sub   Command1_Click()  
          Const   fPath   As   String   =   "c:\temp.txt"  
           
          Dim   strTemp   As   String,   fLen   As   Long  
           
          fLen   =   fileLen(fPath)  
          strTemp   =   Space(fLen)  
          Open   fPath   For   Binary   As   #1   Len   =   fLen  
          Get   #1,   1,   strTemp  
          Close   #1  
           
          Debug.Print   strTemp  
  End   SubTop

5 楼zou19820704(天下英雄)回复于 2006-01-16 14:07:09 得分 0

2进制的话,字节不好控制!!  
    除非文件每行固定是5段  
    每段字节一定,用2进制好用Top

6 楼glc20022003(哈哈)回复于 2006-01-16 14:26:32 得分 0

我刚才查了一下,文本文件是UTF-8格式的.有没有什么方法可以转换成ANSI格式的,或者就把这个文件另存到别的文件夹下,把格式改成ANSI格式的.Top

7 楼glc20022003(哈哈)回复于 2006-01-16 17:15:01 得分 0

没有人呢吗??自己顶一下,大家帮帮忙啊.Top

8 楼rainstormmaster(暴风雨 v2.0)回复于 2006-01-16 20:25:06 得分 0

http://community.csdn.net/Expert/TopicView2.asp?id=4177260Top

9 楼rainstormmaster(暴风雨 v2.0)回复于 2006-01-16 20:46:21 得分 30

一个按钮,一个多行文本框:  
  Option   Explicit  
   
  Private   Sub   Command1_Click()  
          Dim   objStream   As   Object  
          Set   objStream   =   CreateObject("ADODB.Stream")  
           
          With   objStream  
                          .Type   =   2  
                          .Mode   =   3  
                          .Open  
                          .LoadFromFile   "e:\mc3.txt"  
                          .Position   =   0  
                          .Charset   =   "UTF-8"   '   或   "Big5"   或其他編碼  
                          Text1.Text   =   .ReadText  
                          '   PS   :   也可透過   .SaveToFile   方法把檔案存檔  
                          .Close  
          End   With  
          Set   objStream   =   Nothing  
  End   Sub  
  Top

10 楼kingofbird(雪鹰)回复于 2006-01-17 09:19:55 得分 0

把你读到的数据用   StrConv   函数处理一下就可以了Top

11 楼glc20022003(哈哈)回复于 2006-01-17 10:24:30 得分 0

strConv()函数不支持UTF-8的.  
  有没有什么方法把UTF-8格式的文挡改存为ANSI格式的文挡  
  然后我再处理.  
  用了rainstormmaster(暴风雨   v2.0)   的方法,的确可以读出UTF-8文件,  
  我用str   =   objStream.ReadText把读出的文件内容放入变量str,然后写入自己新建的文本,却在文本的开始和结尾莫名的多了两个双引号.  
  如果没有别的好的解决方法,我只有在程序中处理这个双引号了.Top

12 楼iambluebird(胡搅蛮缠)回复于 2006-01-17 10:33:16 得分 15

二进制的,要转换一下,ANSI应该不行吧,转到UCS-2就可以正确显示了,下面是我写的   一个UTF8到UCS2的转换函数.  
   
   
  Public   Function   UTF8ToString(ByRef   aUTF8()   As   Byte)   As   String  
  '-----------------------------------------------  
  'Function   Name:   UTF8ToString  
  'Return   Type:   String  
  'Parameter   List:  
  '               -   aUTF8()   Byte:  
  'Describe:  
  '-----------------------------------------------  
  'Code   By:   Ouyang   Feng  
  'DateTime:   2006-01-10  
  'Version:   1.00  
  '-----------------------------------------------  
  'Edit(1)   -  
  '       Code   By:  
  '       DateTime:  
  '       Version:  
  '-----------------------------------------------  
  On   Error   GoTo   REERR:  
           
          '*     Note:   Add   code   at   here!  
          Dim   strResult       As   String       '用于存储文字结果  
           
          Dim   aChar()   As   Byte           '用于存储UCS-2的编码  
          Dim   lpReadPoint   As   Long           '用于分析UTF-8数组的指针变量  
          Dim   strWORD   As   String       '去掉UTF-8的Hex部分之后剩余的二进制字符串数据  
          Dim   lngUCSByteCount   As   Long   '存储UCS-2编码的数组长度  
          Dim   lngUTFByteCount   As   Long   '存储UTF-8编码的数组长度  
          Dim   lpUTF8Point   As   Long           '单个文字UTF8编码分析中使用的指针  
           
          Dim   strTemp   As   String       '每个字节的二进制编码  
          Dim   intHexBegin   As   Integer     'Hex的开始位置  
           
          Dim   lpUCSPoint   As   Long     '填充UCS编码数据时所使用的指针  
           
          '获取UTF-8编码的字节长度,作为循环上限  
          lngUTFByteCount   =   UBound(aUTF8)  
           
          '将分析指针置0  
          lpReadPoint   =   0  
           
          '循环解码,当分析指针到达并超过循环上界时退出  
          Do   Until   lpReadPoint   >   lngUTFByteCount  
                  '获取下一个文字的UTF-8编码Hex数据  
                  strTemp   =   Format(ZH10to2(aUTF8(lpReadPoint)),   C_EJZFORMAT_8)  
                  intHexBegin   =   InStr(1,   strTemp,   "0")  
                   
                  '如果第一位就是0,则表示这是一个与ACSII码相同的编码,否则,是一个2字节的编码  
                  If   intHexBegin   =   1   Then  
                          '在这种情况下,字符存储只占用了一个字节,直接获取  
                          strResult   =   strResult   &   Chr(aUTF8(lpReadPoint))  
                          '移动指针到下一个字节  
                          MovePoint   lpReadPoint  
                  Else  
                          '当开始位不为0时,表示这个编码使用了超过1个字节的长度来存储  
                          '这个时候使用一个循环提取出所有属于当前文字的编码并采取反序  
                          '重组的方式获得其Unicode编码  
                          '首先获得UTF编码占据的字节空间长度,就是0开始的位置减去1,获得  
                          '开始"1"的个数  
                          lngUCSByteCount   =   intHexBegin   -   1  
                           
                          '循环分析所有属于该文字编码的字节  
                          For   lpUTF8Point   =   0   To   lngUCSByteCount   -   1  
                                  strTemp   =   Format(ZH10to2(aUTF8(lpReadPoint)),   C_EJZFORMAT_8)  
                                  strWORD   =   strWORD   &   Right(strTemp,   8   -   InStr(1,   strTemp,   "0"))  
                                  MovePoint   lpReadPoint  
                          Next  
                           
                          '将strWord的长度以0在之前填充为8的倍数  
                          Do   Until   Len(strWORD)   Mod   8   =   0  
                                  strWORD   =   "0"   &   strWORD  
                          Loop  
                           
                          '获得文字UCS编码所占用的字节长度  
                          lngUCSByteCount   =   Len(strWORD)   /   8  
                          '将lngUCSByteCount强制转换为2的倍数,因为最前面的8位肯定为“0”  
                          If   lngUCSByteCount   =   3   Then   lngUCSByteCount   =   2  
                          If   lngUCSByteCount   =   5   Then   lngUCSByteCount   =   4  
                           
                          '开辟文字UCS编码存储所占用的字节空间  
                          ReDim   aChar(lngUCSByteCount   -   1)  
                           
                          '填充UCS编码数据  
                          '反顺填充,strWord中的高位数据填充到aChar的低位  
                          For   lpUCSPoint   =   0   To   lngUCSByteCount   -   1  
                                  aChar(lpUCSPoint)   =   ZH2to10(Mid(strWORD,   (lngUCSByteCount   -   1   -   lpUCSPoint)   *   8   +   1,   8),   0)  
                          Next  
                           
                          '将文字数据追加到结果变量中  
                          strResult   =   strResult   &   CStr(aChar)  
                           
                          '清空strWord数据,等待下一次循环  
                          strWORD   =   ""  
                  End   If  
          Loop  
           
           
           
           
          '*Note:The   function's   Return   value,must   edit   it!  
          UTF8ToString   =   strResult   '/must   be   edit!  
           
  PORC_EXIT:  
          '*Note:   Add   exit   code   at   here!   Distory   all   parameters   at   here!  
           
          Exit   Function  
           
  REERR:  
          '*Note:The   function's   Return   value   When   an   error,must   edit   it!  
          UTF8ToString   =   ""   '/must   be   edit!  
  '         Call   BugAssert(C_ERROR_UNICODE_UTF8TOUCS2,   C_ERROR_UNICODE_UTF8TOUCS2DE,   "cls_UTF8.UTF8ToString()")  
  End   FunctionTop

13 楼iambluebird(胡搅蛮缠)回复于 2006-01-17 10:34:50 得分 0

上面的函数支持UTF-8到UCS-2和UCS-4的转换,不过在VB下似乎只支持UCS-2的直接显示Top

14 楼iambluebird(胡搅蛮缠)回复于 2006-01-17 10:38:04 得分 0

ZH10TO2(lngValue   as   Long)   as   string   函数是将10进制转换为2进制的函数  
  MovePoint   (pPoint   as   long   [,optional   moveStep   as   long   =   1]   )   as   boolean  
  是将指针移位的函数,类似于pPoint=pPoint+moveStepTop

15 楼glc20022003(哈哈)回复于 2006-01-17 11:17:43 得分 0

谢谢各位了,给分!!Top

相关问题

  • 为什么.txt文件读出来的是乱码?
  • 为何读出TXT文本文件的内容是乱码
  • 从TXT文件里读取中文,读出来的全是乱码!
  • 为什么我读出来的文本文件是乱码?
  • 从文本文件中读出汉字时显示乱码!
  • 写文本文件,文本文件里不是乱码,但是用程序读出来的是乱码。。
  • 我从文本文件中读出的汉字为何成了(??*@#$%^)乱码。
  • 输出的文件为何是乱码?怎么读出这样的文件到一链表中呢?
  • StreamReader读出了乱码
  • 我把一个结构体写入文件,为什么读出来就成了乱码啦?

关键词

  • 文件
  • 读出
  • 格式
  • flen
  • objstream
  • fpath
  • txt
  • 方法
  • strtemp
  • utf

得分解答快速导航

  • 帖主:glc20022003
  • faysky2
  • rainstormmaster
  • iambluebird

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo