java中防止乱码的代码 java中防止乱码的代码是什么

java爬虫一段话里的部分字符乱码解决

1. 网络爬虫乱码的原因。

成都做网站、成都网站制作介绍好的网站是理念、设计和技术的结合。成都创新互联拥有的网站设计理念、多方位的设计风格、经验丰富的设计团队。提供PC端+手机端网站建设,用营销思维进行网站设计、采用先进技术开源代码、注重用户体验与SEO基础,将技术与创意整合到网站之中,以契合客户的方式做到创意性的视觉化效果。

源网页的编码与抓取后的编码转换不一致。如果源网页是gbk编码的字节流,程序在我们抓取后直接用utf-8编码输出到存储文件,这必然会造成乱码,即当源网页编码与程序抓取后直接处理编码一致时,就不会出现乱码,然后统一字符编码后也就不会出现乱码。注意区分源网络代码A,程序B直接使用的代码,统一转换字符的代码C。

2. 是网页的服务器端代码。

B.捕获的数据原本是字节数组,由A编码,只有B=A才能保证不会出现乱码;否则,当字符集不兼容时,就会出现乱码字符。这一步常用于测试。

c、统一转码是指在获得网页的原始编码A后进行统一编码,主要是将每个网页的数据统一成一种编码,往往首选字符集较大的utf-8。

每个网页都有自己的代码,比如gbk,utf-8,iso8859-1,日本jp系统代码,西欧,俄语等等。爬行时,所有类型的代码都将被扩展。有的爬虫只是简单的识别网页,然后统一编码,有的则直接按照utf-8统一处理,不需要判断源网页,显然会造成乱码。

3. 乱码的解决方案。

根据原因找到解决办法很简单。

1) 确定源网页的代码a。

代码a通常位于网页的三个位置,即httpheader的内容、网页的元字符集和网页标题中的文档定义。获取源网页代码时,依次判断这三部分数据,从头到尾优先级相同。

理论上这是对的,但是国内有些网站不符合标准。比如写出来的gbk其实是utf-8,有的写出来是utf-8,其实是gbk。当然这是几个网站,但是确实存在。因此,在确定网页编码时,应该对这种特殊情况给予特殊处理,如中文检查、默认编码等策略。

在另一种情况下,如果以上三种都没有编码信息,一般使用第三方的网页编码智能识别工具,如cpdetector。原理是通过统计字节数组的特性来计算实际编码,有一定的准确率,但是我发现在实践中准确率还是很有限的。

但是综合以上三种编码确认方法后,中文乱码的问题几乎可以完全解决。在我的基于nutch1.6的网络爬虫系统中,经过统计,编码准确率可以达到99.99%,这也证明了上述方法和策略的可行性。

2) 程序通过代码b还原源网页数据。

显然,这里的B应该等于a,在java中,如果源网页的字节数组是source_byte_array,就会转换成stringstr=newstring(source_byte_array,B)。即这些字节数组对应的字符被正确编码显示在内存中,此时打印结果正常。此步骤通常用于调试或控制台输出测试。

3) 统一转码。

网络爬虫系统中有很多数据源。如果无法使用数据,它将被转换为其原始数据,如果这样做是浪费的。所以一般爬虫系统要对抓取的结果进行统一编码,做到一致,使用方便。此时,在(2)的基础上,可以进行统一的编码转换,在java中的实现如下。

源网页的字节数组是source_byte_array。

转换为普通字符串:stringnormal_source_str=newstring(source_byte_array,c)。这时候可以直接用javaapi存储,但是字符串往往不直接写。因为一般爬虫存储是将多个源网页存储在一个文件中,所以要记录字节偏移量,所以下一步。 再将得到的str转换为统一的编码C格式的字节数组,则byte[] new_byte_array=normal_source_str.getBytes(C)即可,此时即可用java io api将数组写入文件,并记录相应的字节数组偏移量等,待真正使用时,直接io读取即可。

爬虫过程不仅会存在乱码问题,还会存在网站爬取涉及法律、IP受限,爬取行为受限等等问题,这个时候就需要不断去解决这些问题。

JAVA读写文件,如何避免中文乱码

1、你要将所有的文件的编码都设置成UTF-8,还有,你的MyEclipse或者Eclipse应该配置jsp还有java文件还有项目都设置为UTF-8.

2、eclipse 中使用模板新建 JSP,xhtml等 文件时,默认的编码为:ISO-8859-1。 ISO-8859-1 编码对于中文的显示是不支持的,如果要支持简体中文,则编码方式应为 GBK 或者 GB2312 或者 UTF-8(推荐) 等。右键菜单栏window -- preferences -- 在type filter text中输入jsp; -- 选择下面的jsp - 选择creating files组中的encoding 为UTF-8编码就可以了

如果要使新建立工程、java文件直接使UTF-8则需要做以下工作: 

1、windows-Preferences...打开"首选项"对话框,左侧导航树,导航到general-Workspace,右侧 Text file encoding,选择Other,改变为UTF-8,以后新建立工程其属性对话框中的Text file encoding即为UTF-8。

2、windows-Preferences...打开"首选项"对话框,左侧导航树,导航到general-Content Types,右侧Context Types树,点开Text,选择Java Source File,在下面的Default encoding输入框中输入UTF-8,点Update,则设置Java文件编码为UTF-8。其他java应用开发相关的文件 如:properties、XML等已经由Eclipse缺省指定,分别为ISO8859-1,UTF-8,如开发中确需改变编码格式则可以在此指定。

java中文乱码,能说下string.getBytes()和new String()转码是,具体点。

1、Java中,【String.getBytes(String decode)】的方法,会根据指定的decode,编码返回某字符串在该编码下的byte数组表示,例如:

byte[] b_gbk = "中".getBytes("GBK");

byte[] b_utf8 = "中".getBytes("UTF-8");

byte[] b_iso88591 = "中".getBytes("ISO8859-1")

上面三行代码表示:分别返回“中”这个汉字在GBK、UTF-8和ISO8859-1编码下的byte数组表示,此时b_gbk的长度为2,b_utf8的长度为3,b_iso88591的长度为1。

2、而通过【new String(byte[], decode)】的方式来还原这个“中”字时,实际是使用decode指定的编码来将byte[ ]解析成字符串,例如:

String s_gbk = new String(b_gbk,"GBK");

String s_utf8 = new String(b_utf8,"UTF-8");

String s_iso88591 = new String(b_iso88591,"ISO8859-1");

s_gbk和s_utf8都是“中”,而只有s_iso88591是一个不认识 的字符,因为ISO8859-1编码的编码表中,根本就没有包含汉字字符,当然也就无法通过"中".getBytes("ISO8859-1")。

因此,通过【String.getBytes(String decode)】方法来得到byte[ ]时,要确定decode的编码表中确实存在String表示的码值,这样得到的byte[ ]数组才能正确被还原。

扩展资料

java中文编码避免乱码

1、为了让中文字符适应某些特殊要求(如http header头要求其内容必须为iso8859-1编码),可能会通过将中文字符按照字节方式来编码的情况,比如:

String s_iso88591 = new String("中".getBytes("UTF-8"),"ISO8859-1")

2、上述例子中的s_iso8859-1字符串实际是三个在 ISO8859-1中的字符,在将这些字符传递到目的地后,目的地程序再通过相反的方式:

String s_utf8 = new String(s_iso88591.getBytes("ISO8859-1"),"UTF-8")

来得到正确的中文汉字。这样就既保证了遵守协 议规定、也支持中文。

3、String.getBytes(String decode)方法会根据指定的decode编码返回某字符串在该编码下的byte数组表示这里是encode ,not decode,从字符串到字节数组是编码的过程,从字节数组到字符串(即 new String(byte[] , charsetname))才是解码的过程。

参考资料:百度百科-UTF-8

java中filewriter中文乱码怎么解决?

要明白,用filewriter读取文件采取的是平台默认编码(视操作系统而定)。当要写入的文本文件编码和平台默认编码不一致时,就会出现中文乱码的情况。这时可以使用filewriter 的父类OutputStreamWriter来读取。OutputStreamWriter允许用户指定编码方式,代码为:

FileInputStream fis=new FileInputStream("文件路径");

OutputStreamWriter osw=new OutputStreamWriter(fis,"文本文件的编码方式(ANSI,UTF-8...)");

osw.write();

这样写入的编码可以保证和源文本文件编码一致,就不会出现乱码了。。。


分享文章:java中防止乱码的代码 java中防止乱码的代码是什么
分享网址:http://pwwzsj.com/article/hpcdog.html