用爬虫获取网页信息的时候,我们可能会遇到这样一个情况,网页看到是汉字但是爬虫获取的却是\u6211\u6211\uxxxx这样的一堆字符,这是什么鬼?在网上搜索得出的方法要么是说转码要么是说可以直接输出就可以。但是都不能解决我们遇到的问题。今天在这里我们就从底层去了解出现这类情况的原因吧
\u6211是什么?
这是汉字我
经过unicode编码产生的
unicode是什么?
世界上存在着多种编码方式,在ANSI编码下,同一个编码值,在不同的编码体系里代表着不同的字。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码,可能最终显示的是中文,也可能显示的是日文。在ANSI编码体系下,要想打开一个文本文件,不但要知道它的编码方式,还要安装有对应编码表,否则就可能无法读取或出现乱码。为什么电子邮件和网页都经常会出现乱码,就是因为信息的提供者可能是日文的ANSI编码体系和信息的读取者可能是中文的编码体系,他们对同一个二进制编码值进行显示,采用了不同的编码,导致乱码。这个问题促使了unicode码的诞生。
出现\u的原因
而我们遇到的问题即是汉字在用unicode编码后字符串,它以\uxxxx的格式显示,之所以没有显示为汉字是因为没有解码,我们看到的
\u6211
是字符串格式,所以它其实是\\u6211
,第一个反斜杠转义了后面一个反斜杠,导致无法正确解码
怎么将我
转成\u6211
?
js
escape("我")
//输出的结果为:"%u6211"
python
s = "我爱你"
s = s.encode("unicode-escape")
print(s)
#输出的结果为: b'\\u6211\\u7231\\u4f60'
java
String s = "我爱你";
char[] chars = s.toCharArray();
String returnStr = "";
for (char aChar : chars) {
returnStr += "\\u" + Integer.toString(aChar, 16);
}
System.out.println(returnStr);
//输出的结果为:\\u6211\\u7231\\u4f60
怎么将\\u6211
转成我
?
python
import re
def replace(matched):
h_s = matched.group(1)
h_i = int(h_s, base=16)
return chr(h_i)
def uni_to_cn(s: str):
result = re.sub(r"\\u([0-9a-fA-F]{4})", replace, s)
return result
cn = uni_to_cn('\\u6211')
print(cn)
java
public static String uniToCn(String s) {
Pattern pattern = Pattern.compile("\\\\u([0-9a-fA-F]{4})");
Matcher matcher = pattern.matcher(s);
StringBuilder sb = new StringBuilder(s);
int count = 0;
while (matcher.find()) {
int code = Integer.parseInt(matcher.group(1), 16);
char c = (char) code;
int start = matcher.start();
sb.replace(start - count * 5, start + 6 - count * 5, String.valueOf(c));
count++;
}
return sb.toString();
}
笔者能力有限,如有错误,欢迎指正
网友评论