一个文件多种字符编码,如何解析

2015-04-22 08:58:40 +08:00
 ivito
比如一个文件中既有gb2312又有utf8,意思就是不能用一种编码解析出来,有什么办法把该文件解析成同一种编码呢
5140 次点击
所在节点    Python
21 条回复
clino
2015-04-22 09:18:09 +08:00
两个都试试咯,有UnicodeDecodeError之类的就试下一个编码,不过这种方法碰到两种都能decode的就抓瞎了
future0906
2015-04-22 09:20:54 +08:00
UTF-8和GB2312的编码空间应该是有重叠,没办法自动解析,手工处理吧。
clino
2015-04-22 09:23:12 +08:00
或者碰到两种都能decode的才人工判断下,只有一种能decode就能自动了
bombless
2015-04-22 09:24:19 +08:00
这个时候你需要 ML (逃

要不基于某种马卡罗夫链?(再逃
amaranthf
2015-04-22 09:31:56 +08:00
这两种编码混杂在同一个文件中,几乎不可能自动识别吧,毕竟编码有重叠。只能人工喽。
io
2015-04-22 09:34:12 +08:00
神经网络
ivito
2015-04-22 09:37:49 +08:00
@clino 确实,不知道从哪个字节开始用哪一种编码
ivito
2015-04-22 09:38:40 +08:00
@future0906 不知道编辑器是怎么处理的,遇到无法解析的会显示乱码怎么实现的呢
ivito
2015-04-22 09:40:43 +08:00
@clino
@bombless
@io
@amaranthf
看来只能用算法解决了
mhycy
2015-04-22 09:52:07 +08:00
你需要一个常用词列表才有可能进行部分自动的转换
方案如下:
1 - 按双字节拆分,用GB2312解码(其实这个步骤就是直接用GB2312解码)
2 - 遇到GB2312无法解码的字符,明确标记为UTF-8
3 - 一般中文在UTF-8都使用3字节进行储存,所以对于这篇文文章照样进行三字节拆分
4 - 移位三次,提出确认落在 u4E00 - u9FFF 范围内的的字符
5 - 上常用词表进行过滤
(如果常用词表有文字使用频率的话,多个解码结果进行加权投票选字能提高成功率)
mhycy
2015-04-22 09:55:18 +08:00
补充个地址:
http://www.oschina.net/question/102136_40922
这帖子提到的UTF-8的编码规律可以作为一个模式进行判断..
ivito
2015-04-22 10:01:53 +08:00
@mhycy 感觉这个方法处理纯中文应该可以,但一般文档是中英文都有的,其中英文部分gb2312和utf8兼容ascii 只有一个字节,按照你的思路稍微做一些修改应该可以,但没想好用什么数据结构表示结果中产生的多种可能性
imn1
2015-04-22 10:05:58 +08:00
如果是标记语言文本,并且知道有什么编码,就容易些,按标签分割判断
纯文本的话,如果两种编码之间没有明确分界,例如换行,就很难办了
mhycy
2015-04-22 10:10:36 +08:00
@ivito 人生苦短...用python
这种事先把算法弄出来,性能还是别管了
英文处理的确是个问题,但一般这些编码混合都是大段编码混叠的
多几次处理应该可以..就看怎么写了...
ivito
2015-04-22 10:13:51 +08:00
@mhycy 靠谱,先写一版试试
zouxy
2015-04-22 10:21:10 +08:00
想不到还有这种需求.
如果只有中文.还可以搞搞.
如果是全世界的文字,就没办法了.
FrankFang128
2015-04-22 10:22:57 +08:00
靠猜
ivito
2015-04-22 10:25:14 +08:00
@zouxy 有些文档不知道怎么弄的,里边就有乱码,某些部分可以用utf8 打开,某些部分可以用gb2312打开
ivito
2015-04-22 10:25:47 +08:00
@FrankFang128 字符太多,没法一个一个猜啊
mhycy
2015-04-22 10:35:27 +08:00
@zouxy
我们公司的陈年老代码曾经输出过这样的文档...
幸好有数据库访问权和源码,改写代码完事...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/185388

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX