当前位置: 首页 > 工具软件 > U++ > 使用案例 >

java unicode 我爱你,各语言解决\\u6211%u6211\u6211问题

艾谦
2023-12-01

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

}

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

 类似资料: