本文共 919 字,大约阅读时间需要 3 分钟。
提取网页编码,最简单也是最有效的方法是到网页数据头里去找
但方法要写的稳定、通用,其实并没有表明上看的那样简单
陈运文
这些简单写写注意点:
1 charset string 的选取
注意不同的网页lang标准,string可能是不同的:
bool is_xml = html_start != NULL && (strncmp(html_start, "<rss", 4) == 0 || strncmp(html_start, "<?xml", 5) == 0);
const char* charset_str = is_xml ? "encoding" : "charset";
2 通过寻找串 "document.write" 来精确定位
注意网页文本可能本身不规范,未必一定有charset出现
3 大小写要归一(UTF-8/utf-8),空格、括号等无用字符要去除
4 判断是否编码类型:strncasecmp(page, "vti_encoding", 12) == 0
vti_encoding表示网页是由microsoft frontpage生成的hidden web,这种网页显示乱码,可丢弃
5 从提取的charset字段映射到对应的编码方式
可能存在的编码方式太多了,中文和日文的编码方式尤其多,一定需要小心的处理:
iso-8859
iso-2022
gb2312
gbk
gb18030
big5
sjis
ujis
jis
shift
euckr - 棒子语
eucjp
autocht
utf-*
6 取一段网页文本来验证是否编码方式正确,
这个涉及到具体编码表,比较复杂,这里简单贴几个中文gb编码使用的:
#define GBK_1LO 0x81 //129
#define GBK_1HI 0xfe //254#define GBK_1NUM 0x7e //126#define GBK_2LO 0x40 //64#define GBK_2HI 0xfe //254#define GBK_2NUM 0xbf //191#define GBK_2INV 0x7f //127
下次具体写写
转载地址:http://jcmrb.baihongyu.com/