java爬取网页Unicode转UTF-8中文
unicode编码简而言之就是将每一个字符用16位2进制数标识。但是通常都用4位的16进制数标识。 例如:
1)中文字符串"你好"的unicode码为:\u60\u597d;
2)英文字符串"ab"的unicode码为:\u0061\u0062;
其中\u是标识unicode码用的,后面的4位16进制数则是对应字符的unicode码。
写爬虫的过程中,经常遇到一些网站的中文是经过Unicode转码的。在对网页进行解析时,需要将其进行转码,转为中文字符。
例如:
\u30102017\u534e\u4e3aHC\u5927\u4f1a\u76f4\u64ad\u3011\u6700\u5168\u3001\u6700\u9707\u64bc\u7684HC\u73b0\u573a\u7167\u7247\u770b\u8fd9\u91cc\uff01\uff01\uff01
对应的中文是:
【2017华为HC大会直播】最全、最震撼的HC现场照片看这里!!!
unicode码在J2EE项目中应用广泛,java对unicode码提供了很好的支持。例如国际化,则是unicode的经典运用。那么unicode的编码规则具体是什么,如何用程序实现?
1.unicode编码规则
unicode码对每一个字符用4位16进制数表示。具体规则是:将一个字符(char)的高8位与低8位分别取出,转化为16进制数,如果转化的16进制数的长度不足2位,则在其后补0,然后将高、低8位转成的16进制字符串拼接起来并在前面补上"\u" 即可。
2.普通转码
对直接的字符串转码可以用一下方式,但是对于网络中爬的数据却是无效的。
String unicode = "\u30102017\u534e\u4e3aHC\u5927\u4f1a\u76f4\u64ad\u3011\u6700\u5168\u3001\u6700\u9707\u64bc\u7684HC\u73b0\u573a\u7167";
String result = new String(unicode.getBytes("UTF-8"), "UTF-8");
3.Unicode转码成String:
public static String decodeUnicode(String str) {
Charset set = Charset.forName("UTF-16");
Pattern p = Pattern.compile("\\\\u([0-9a-fA-F]{4})");
Matcher m = p.matcher(str);
int start = 0;
int start2 = 0;
StringBuffer sb = new StringBuffer();
while (m.find(start)) {
start2 = m.start();
if (start2 > start) {
String seg = str.substring(start, start2);
sb.append(seg);
}
String code = m.group(1);
int i = Integer.valueOf(code, 16);
byte[] bb = new byte[4];
bb[0] = (byte) ((i >> 8) & 0xFF);
bb[1] = (byte) (i & 0xFF);
ByteBuffer b = ByteBuffer.wrap(bb);
sb.append(String.valueOf(set.decode(b)).trim());
start = m.end();
}
start2 = str.length();
if (start2 > start) {
String seg = str.substring(start, start2);
sb.append(seg);
}
return sb.toString();
}
4.当然也可以将String转换成Unicode:
public static String stringYoUnicode(String str) {
str = (str == null ? "" : str);
String tmp;
StringBuffer sb = new StringBuffer(1000);
char c;
int i, j;
sb.setLength(0);
for (i = 0; i < str.length(); i++) {
c = str.charAt(i);
sb.append("\\u");
j = (c >>> 8); // 取出高8位
tmp = Integer.toHexString(j);
if (tmp.length() == 1)
sb.append("0");
sb.append(tmp);
j = (c & 0xFF); // 取出低8位
tmp = Integer.toHexString(j);
if (tmp.length() == 1)
sb.append("0");
sb.append(tmp);
}
return (new String(sb));
}
java爬取网页Unicode转UTF-8中文的更多相关文章
- 使用JAVA爬取网页图片
经过之前的HttpURLConnection还有各种流的结束,已经可以开始理解怎么下载网页上的一张图片了. 对各种流不理解的话,可以翻翻前面的随笔,讲得都比较详细.在此就不细讲了. 主要流程: 1.H ...
- Java两种方式简单实现:爬取网页并且保存
注:如果代码中有冗余,错误或者不规范,欢迎指正. Java简单实现:爬取网页并且保存 对于网络,我一直处于好奇的态度.以前一直想着写个爬虫,但是一拖再拖,懒得实现,感觉这是一个很麻烦的事情,出现个小错 ...
- java爬虫-简单爬取网页图片
刚刚接触到“爬虫”这个词的时候是在大一,那时候什么都不明白,但知道了百度.谷歌他们的搜索引擎就是个爬虫. 现在大二.再次燃起对爬虫的热爱,查阅资料,知道常用java.python语言编程,这次我选择了 ...
- [python] 常用正则表达式爬取网页信息及分析HTML标签总结【转】
[python] 常用正则表达式爬取网页信息及分析HTML标签总结 转http://blog.csdn.net/Eastmount/article/details/51082253 标签: pytho ...
- Java爬取B站弹幕 —— Python云图Wordcloud生成弹幕词云
一 . Java爬取B站弹幕 弹幕的存储位置 如何通过B站视频AV号找到弹幕对应的xml文件号 首先爬取视频网页,将对应视频网页源码获得 就可以找到该视频的av号aid=8678034 还有弹幕序号, ...
- 使用Post方法模拟登陆爬取网页
最近弄爬虫,遇到的一个问题就是如何使用post方法模拟登陆爬取网页.下面是极简版的代码: import java.io.BufferedReader; import java.io.InputStre ...
- 一起学爬虫——使用Beautiful Soup爬取网页
要想学好爬虫,必须把基础打扎实,之前发布了两篇文章,分别是使用XPATH和requests爬取网页,今天的文章是学习Beautiful Soup并通过一个例子来实现如何使用Beautiful Soup ...
- 使用webdriver+urllib爬取网页数据(模拟登陆,过验证码)
urilib是python的标准库,当我们使用Python爬取网页数据时,往往用的是urllib模块,通过调用urllib模块的urlopen(url)方法返回网页对象,并使用read()方法获得ur ...
- Java爬取校内论坛新帖
Java爬取校内论坛新帖 为了保持消息灵通,博主没事会上上校内论坛看看新帖,作为爬虫爱好者,博主萌生了写个爬虫自动下载的想法. 嗯,这次就选Java. 第三方库准备 Jsoup Jsoup是一款比较好 ...
随机推荐
- vue.js 作一个用户表添加页面----初级
使用vue.js 制作一个用户表添加页面,实际上是把原来需要使用js写的部分,改写成vue.js的格式 首先,想象一下,先做思考,我们要添加用户表,设涉及到哪些数据,一个是用户id,一个是用户名,一个 ...
- jquery接触初级-----juqery 动画函数
1. window.onload(), 一次只能保存对一个函数的引用:如果多次调用,他会自动用后面的函数覆盖前面的函数 2.$(document).ready(); 会在现有行为上追加新的行为,这些函 ...
- Pronunciation – The Definitive Guide to the Top 100 Words in American English
Pronunciation – The Definitive Guide to the Top 100 Words in American English Share Tweet Share Tagg ...
- 手工获取AWR报告
AWR(Automatic Workload Repository)报告常用于Oracle数据库性能分析.熟练解读AWR报告有助于快速分析Oracle性能问题.下面主要描述如何手工获取AWR报告. 操 ...
- centOS6.6网络设置
linux的网卡IP地址是存放在文件中的,这个配置文件在/etc/sysconfig/network-scripts下, 名称分别为ifcfg-eth0,ifcfg-eth1等 如果你只有一块网卡,就 ...
- 在JSP页面中导入jstl标签库
1 在工程中引用JSTL的两个jar包和标签库描述文件. (1)在项目上右击,从弹出的快捷键菜单中选择Properties命令,在出现的项目属性对话框上,选择DeploymentAssembly. ( ...
- ubuntu14.04后安装win10记录
1首先修改启动引导顺序,从U盘启动, 2自动安装,产生一个问题,gpt分区无法安装,解决方法,感谢https://jingyan.baidu.com/article/08b6a591c82df414a ...
- 学习JS的心路历程-范围Scope和提升(Hoisting)
在上一篇提到了JS有三种声明变量的方式,分别是var.const及let,var和const let最大区别就是范围(scope)的限制.所以在这一篇我们会详谈何谓范围链及他们的复写优先级. 范围Sc ...
- tf.Variable和tensor的区别(转)
刷课过程中思考到Variable和Tensor之间的区别,尝试发现在如下代码中: a = tf.Variable(tf.ones(1)) b = tf.add(a,tf.ones(1)) 1 2 a是 ...
- SQL Server和MySQL数据库
导读:接下来的网上商城的项目,需要用到MySQL数据库了.这个对于我来说,是一个新接触的东西,按照惯例,在刚开始学习一个东西的时候,先从宏观上去了解它.本篇博客,先介绍SQL Server的基本内容, ...