Chinaunix

标题: 读取文件后,怎么判断该文件里是否有乱码? [打印本页]

作者: chenxiam    时间: 2008-11-06 13:28
标题: 读取文件后,怎么判断该文件里是否有乱码?
用perl读取一个文件后,要怎么判断所读的文件中是否有乱码? 正则该怎么写?
作者: MMMIX    时间: 2008-11-06 13:28
原帖由 chenxiam 于 2008-11-6 15:23 发表

那如果文件的格式是txt的,比如文件为1.txt,用户把它改成1.doc后再提交,那该怎么办啊?这种情况下怎么判断文件的格式?

Unix/Linux 下有一命令叫做 file(1),当然它的结果也不是 100% 准确的,不过还可以参考。不清楚 Perl 中有没有功能类似的函数或者说模块,也许你可以直接在 Perl 代码中调用 file(1)。

另外,不要想着你能完美的处理所有情况,例如用户把 .txt 改为 .doc 后提交,打回去让他/她/它修改后重新提交也许是最靠谱的做法。
作者: cobrawgl    时间: 2008-11-06 13:32
为什么会出现乱码
作者: chenxiam    时间: 2008-11-06 13:34
原帖由 cobrawgl 于 2008-11-6 13:32 发表
为什么会出现乱码

用户提交的文件,可能有乱码。
作者: ynchnluiti    时间: 2008-11-06 13:41
原帖由 chenxiam 于 2008-11-6 13:34 发表

用户提交的文件,可能有乱码。

乱码是相对的。首先你要确定哪些是合法的字符。
作者: chenxiam    时间: 2008-11-06 13:44
请不要转移话题好吗?我只想知道‘怎么判断所读的文件中是否有乱码? 正则该怎么写?’
作者: odacharlee    时间: 2008-11-06 14:17
最近的新人们怎么提个问题还老摆臭架子?
楼上已经说得很明确了你还想怎样?
好像欠你几万块钱似的
作者: chenxiam    时间: 2008-11-06 14:39
原帖由 odacharlee 于 2008-11-6 14:17 发表
最近的新人们怎么提个问题还老摆臭架子?
楼上已经说得很明确了你还想怎样?
好像欠你几万块钱似的

呵呵,这就收不了了吗,真搞笑,新人怎么了,新人的水平一定菜吗,你凭什么看不起新人啊,我说的有错吗,东西是客户提交的,难道叫他去改吗
作者: odacharlee    时间: 2008-11-06 14:44
客户给你钱吗?
你给我钱吗?
作者: chenxiam    时间: 2008-11-06 14:47
原帖由 odacharlee 于 2008-11-6 14:44 发表
客户给你钱吗?
你给我钱吗?

大家来这里是想解决问题的,没时间跟你这人罗嗦,不要倚老卖老好么,不就是帖子多一点嘛。
作者: MMMIX    时间: 2008-11-06 14:47
原帖由 chenxiam 于 2008-11-6 13:28 发表
用perl读取一个文件后,要怎么判断所读的文件中是否有乱码? 正则该怎么写?

先回答什么是乱码?然后根据你自己的回答写规则就完了。
作者: MMMIX    时间: 2008-11-06 14:49
原帖由 chenxiam 于 2008-11-6 14:47 发表

大家来这里是想解决问题的,

关键是,你既不理解你问的问题,也不理解别人的解答。这才是问题的关键。
作者: chenxiam    时间: 2008-11-06 14:51
原帖由 MMMIX 于 2008-11-6 14:47 发表

先回答什么是乱码?然后根据你自己的回答写规则就完了。

ÐÏࡱá
0
Z¥
00000ÿÿÿ        ÿ ÿÿÿÿÿ=ÿ@ÿ\ÿ]ÿ^ÿàÿ
0 00000ÿÿ;ÿ[ÿáÿåÿ 就是文件中可能有这些字符
作者: hitsubunnu    时间: 2008-11-06 14:52
参看
use utf8;
use Encode;
作者: MMMIX    时间: 2008-11-06 14:54
原帖由 chenxiam 于 2008-11-6 14:51 发表

就是文件中可能有这些字符

那一旦出现这些字符就认为是有乱码。当然,直接判断哪些是合法字符可能更简单些。
作者: chenxiam    时间: 2008-11-06 14:54
我想判断是否文件里存在除了[^A-Z,a-z,0-9],\t,\n,\r,\s等等以外的其它字符

[ 本帖最后由 chenxiam 于 2008-11-6 14:55 编辑 ]
作者: chenxiam    时间: 2008-11-06 14:57
原帖由 hitsubunnu 于 2008-11-6 14:52 发表
参看
use utf8;
use Encode;

我还有个问题是,Encode是否包括word,excel,还有pdf等等的解码吗
作者: cobrawgl    时间: 2008-11-06 14:58
原帖由 chenxiam 于 2008-11-6 14:54 发表
我想判断是否文件里存在除了[^A-Z,a-z,0-9],\t,\n,\r,\s等等以外的其它字符


用 \w 和 \s
作者: chenxiam    时间: 2008-11-06 14:59
原帖由 MMMIX 于 2008-11-6 14:54 发表

那一旦出现这些字符就认为是有乱码。当然,直接判断哪些是合法字符可能更简单些。

匹配乱码是个问题吧,合法字符有很多啊,能列举全吗
作者: MMMIX    时间: 2008-11-06 15:02
原帖由 chenxiam 于 2008-11-6 14:59 发表

匹配乱码是个问题吧,合法字符有很多啊,能列举全吗

其实乱码用在这里是不合适的。只有合法字符和非法字符之分。至于说用哪个作为判断标准更方便,要看情况而定。
作者: chenxiam    时间: 2008-11-06 15:03
原帖由 cobrawgl 于 2008-11-6 14:58 发表


用 \w 和 \s

怎么用,谢谢,貌似\w \s不能列举全吧?
作者: hitsubunnu    时间: 2008-11-06 15:04
原帖由 chenxiam 于 2008-11-6 14:57 发表

我还有个问题是,Encode是否包括word,excel,还有pdf等等的解码吗


能把你的问题尽量描述清楚吗?  

到底是乱码 还是解码   看得我一头雾水
作者: chenxiam    时间: 2008-11-06 15:08
原帖由 hitsubunnu 于 2008-11-6 15:04 发表


能把你的问题尽量描述清楚吗?  

到底是乱码 还是解码   看得我一头雾水

好的,就是用户提交文件给我让我处理,文件的格式是随意的,有可能是word, excel, txt。。。。等等。首先我读取文件是个问题,怎么才能正确的从这么多不同格式的文件中读取我想要的内容,其次我还的以这种格式的文件返回给用户。
作者: cobrawgl    时间: 2008-11-06 15:11


甭用电脑了,你还是雇几个人来做吧
作者: chenxiam    时间: 2008-11-06 15:13
原帖由 cobrawgl 于 2008-11-6 15:11 发表


甭用电脑了,你还是雇几个人来做吧

什么意思?
作者: chensanxing    时间: 2008-11-06 15:19
原帖由 chenxiam 于 2008-11-6 13:44 发表
请不要转移话题好吗?我只想知道‘怎么判断所读的文件中是否有乱码? 正则该怎么写?’


首先你自己必须搞清楚什么叫做乱码!
作者: chenxiam    时间: 2008-11-06 15:20
原帖由 MMMIX 于 2008-11-6 15:02 发表

其实乱码用在这里是不合适的。只有合法字符和非法字符之分。至于说用哪个作为判断标准更方便,要看情况而定。

合法字符有很多吧,比如 \s,\r,\n,\t等等,还有逗号,句号,问号,双引号等等。怎么才能列举全呢
作者: MMMIX    时间: 2008-11-06 15:20
原帖由 chenxiam 于 2008-11-6 15:08 发表

好的,就是用户提交文件给我让我处理,文件的格式是随意的,有可能是word, excel, txt。。。。等等。首先我读取文件是个问题,怎么才能正确的从这么多不同格式的文件中读取我想要的内容,其次我还的以这种格式 ...

先判断下是什么格式的文件,然后根据各种格式分别处理就完了。
作者: chenxiam    时间: 2008-11-06 15:23
原帖由 MMMIX 于 2008-11-6 15:20 发表

先判断下是什么格式的文件,然后根据各种格式分别处理就完了。

那如果文件的格式是txt的,比如文件为1.txt,用户把它改成1.doc后再提交,那该怎么办啊?这种情况下怎么判断文件的格式?
作者: chenxiam    时间: 2008-11-06 15:37
原帖由 MMMIX 于 2008-11-6 15:35 发表

Unix/Linux 下有一命令叫做 file(1),当然它的结果也不是 100% 准确的,不过还可以参考。不清楚 Perl 中有没有功能类似的函数或者说模块,也许你可以直接在 Perl 代码中调用 file(1)。

另外,不要想着你能 ...

好的,谢谢了。
作者: MMMIX    时间: 2008-11-06 15:40
就这个悬赏而言,分应该给 ynchnluiti
作者: jayeley    时间: 2008-11-06 16:10
乱码确实是相对的,如果有人在文章里引用一则乱码来说面问题,那么在他的文章里乱码的字符就不算是乱码了,因为他就是要给别人讲乱码这个例子。当热这个例子很极端,不过却是事实。楼主的这个问题确实是无解的,可标题居然写着已解决,奇怪了,我也懒得看最后一页了!
作者: linxd    时间: 2008-11-12 20:08
标题: 回复 #32 jayeley 的帖子
个人理解,楼主的乱码的产生有两种可能:
1.文件类型不匹配,纯文本被当作doc,或者doc被当作纯文本
2.即使都是纯文本,也还有各种各样的编码,就中文而言,常见的UTF-8,GB2312,BIG5,如果不知道编码,以错误的方式解释,依然是乱码。

第一种可能,用file,或者自己搜集一下各种格式文件的头部格式,然后写个程序自己判断(其实特定领域用户能够用到的应该不多)
第二种可能,需要一些复杂的算法,简单的说就是进行概率统计,看以哪一种编码解释的可能性更高,下面的网址的资料可以参考。 也有人将mozilla的实现移植到了python,不知道perl有没有类似的实现,即使没有,我想python都有了,移植到perl应该不难

http://www.mozilla.org/projects/ ... arsetDetection.html
Python的实现:
http://chardet.feedparser.org/




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2