LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: Hosanna

如何知道一个文件用的是什么编码?

[复制链接]
发表于 2009-1-20 13:01:53 | 显示全部楼层
不太清楚意图。。就我知道的几种常见的格式(以指定十六进制开始的):

ef bb bf 开始的表示 utf8
FE FF/FF FE 表示小头/大头 utf16,M$混淆为 ucs-2(大头在m$网络文档又混淆为网络字节序,死也不肯招是unix序)
ff fe 00 00/00 00 ff fe 则分别表示 utf32 小头/大头

通常程序只能检测local码跟utf码,也就是说通常识别gbk 或 utf,而无法区别gbk shift-jis 这样的编码,硬要实现则必须进行全文编码识别(搜索所有文字的字节表示的范围属于哪个local)。

update:
  1. 也就是说通常识别gbk 或 utf,而无法区别gbk shift-jis 这样的编码
复制代码
意思是说
  1. 也就是说通常识别gbk/shift-jis 还是 utf,而无法区别gbk 还是 shift-jis 这样的编码,换句话说,区别是ascii、utf、非utf 的local编码 三种,而非utf的local 要再细化成gbk/shift-jis 类似则需要进行全文byte上下标范围收集才可以,工作量很大
复制代码
回复 支持 反对

使用道具 举报

发表于 2009-1-20 13:36:49 | 显示全部楼层
chardet的目的就是要识别任意字符集
比如gbk, shift-jis
当然样本要足够大,才能更准确
回复 支持 反对

使用道具 举报

发表于 2009-1-20 14:58:59 | 显示全部楼层
你说的是BOM,微软特别喜欢的东东,但是Linux下用得不多..

Post by arli;1939969
不太清楚意图。。就我知道的几种常见的格式(以指定十六进制开始的):

ef bb bf 开始的表示 utf8
FE FF/FF FE 表示小头/大头 utf16,M$混淆为 ucs-2(大头在m$网络文档又混淆为网络字节序,死也不肯招是unix序)
ff fe 00 00/00 00 ff fe 则分别表示 utf32 小头/大头

通常程序只能检测local码跟utf码,也就是说通常识别gbk 或 utf,而无法区别gbk shift-jis 这样的编码,硬要实现则必须进行全文编码识别(搜索所有文字的字节表示的范围属于哪个local)。
回复 支持 反对

使用道具 举报

发表于 2009-1-20 18:00:08 | 显示全部楼层
那个能做到全文识别呢?
回复 支持 反对

使用道具 举报

发表于 2009-1-20 22:09:27 | 显示全部楼层
汗,俺向来都是在Firefox里试的
回复 支持 反对

使用道具 举报

发表于 2009-1-20 23:42:46 | 显示全部楼层
Post by 食古不化;1940089
那个能做到全文识别呢?

chardet啊
回复 支持 反对

使用道具 举报

发表于 2009-1-20 23:55:14 | 显示全部楼层
python
>>>import chardect
>>>file=open('/aa/bb/cc/dd')
>>>a=file.read()
>>>file.close()
>>>encoding=chardet.detect(a)['encoding']
>>>print encoding
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表