美文网首页
各语言解决\\u6211%u6211\u6211问题

各语言解决\\u6211%u6211\u6211问题

作者: small瓜瓜 | 来源:发表于2019-05-01 12:19 被阅读0次

用爬虫获取网页信息的时候,我们可能会遇到这样一个情况,网页看到是汉字但是爬虫获取的却是\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();
    }

笔者能力有限,如有错误,欢迎指正

相关文章

网友评论

      本文标题:各语言解决\\u6211%u6211\u6211问题

      本文链接:https://www.haomeiwen.com/subject/afsinqtx.html