开发者社区> 科技小能手> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

java字符串编码类型获取

简介:
+关注继续查看
源码下载地址:[url]http://download.csdn.net/source/414086[/url]

汉字编码是一项较为麻烦的事情,弄不好就会造出些谁都看不懂的乱码。比如我想做个针对汉字网站的爬虫系统,需要对非特定的页面进行数据解析处理,而此时我所访问的页面编码格式未知,如果不能正确处理页面编码,则很难获得我们理想中的数据。

通常这时候可能有几种选择:

一是根据response的ContentType获得,如果服务器支持的话此项中会返回charset数值,解析即可。但对不返回或者不支持的服务器则无能为力。

二是使用正则或自定义解析函数截取页面中‘charset=’后的数据,采取死钉战术,但万一采集的页面中没有此项或者此项有错,也就回天乏术。

三就是老老实实的解析全文,最后返回一个符合的编码格式。

此例中我演示了几种较常见编码的识别方法,通过统计编码为指定编码的或然率, 而后返回可能性最高的编码方式。在无法获得确切编码之时,这可说是一种唯一的选择。

这种识别方式主要是针对汉字编码而来,所以对应页面中的汉字数目越多,统计结果就越准确,反之则很难识别出正确结果。

Encoding.java
package org.loon.test.encoding;

/**
 * <p>
 * Title: LoonFramework
 * </p>
 * <p>
 * De.ion:编码基本类型集合
 * </p>
 * <p>
 * Copyright: Copyright (c) 2008
 * </p>
 * <p>
 * Company: LoonFramework
 * </p>
 * <p>
 * License: 
http://www.apache.org/licenses/LICENSE-2.0
 * </p>
 * 
 * 
@author chenpeng
 * @email:ceponline@yahoo.com.cn
 * 
@version 0.1
 
*/

public class Encoding {

    
// 支持的字符格式
    public static int GB2312 = 0;

    
public static int GBK = 1;
    
    
public static int BIG5 = 2;

    
public static int UTF8 = 3;

    
public static int UNICODE = 4;

    
public static int EUC_KR = 5;

    
public static int SJIS = 6;

    
public static int EUC_JP = 7;

    
public static int ASCII = 8;

    
public static int UNKNOWN = 9;

    
public static int TOTALT = 10;

    
public final static int SIMP = 0;

    
public final static int TRAD = 1;

    
// 解析名称用
    public static String[] javaname;

    
// 编码用
    public static String[] nicename;

    
// 应用于html中的字符集
    public static String[] htmlname;

    
public Encoding() {
        javaname 
= new String[TOTALT];
        nicename 
= new String[TOTALT];
        htmlname 
= new String[TOTALT];
        javaname[GB2312] 
= "GB2312";
        javaname[GBK] 
= "GBK";
        javaname[BIG5] 
= "BIG5";
        javaname[UTF8] 
= "UTF8";
        javaname[UNICODE] 
= "Unicode";
        javaname[EUC_KR] 
= "EUC_KR";
        javaname[SJIS] 
= "SJIS";
        javaname[EUC_JP] 
= "EUC_JP";
        javaname[ASCII] 
= "ASCII";
        javaname[UNKNOWN] 
= "ISO8859_1";

        
// 分配编码名称
        htmlname[GB2312] = "GB2312";
        htmlname[GBK] 
= "GBK";
        htmlname[BIG5] 
= "BIG5";
        htmlname[UTF8] 
= "UTF-8";
        htmlname[UNICODE] 
= "UTF-16";
        htmlname[EUC_KR] 
= "EUC-KR";
        htmlname[SJIS] 
= "Shift_JIS";
        htmlname[EUC_JP] 
= "EUC-JP";
        htmlname[ASCII] 
= "ASCII";
        htmlname[UNKNOWN] 
= "ISO8859-1";

        
// 分配可读名称
        nicename[GB2312] = "GB-2312";
        nicename[GBK] 
= "GBK";
        nicename[BIG5] 
= "Big5";
        nicename[UTF8] 
= "UTF-8";
        nicename[UNICODE] 
= "Unicode";
        nicename[EUC_KR] 
= "EUC-KR";
        nicename[SJIS] 
= "Shift-JIS";
        nicename[EUC_JP] 
= "EUC-JP";
        nicename[ASCII] 
= "ASCII";
        nicename[UNKNOWN] 
= "UNKNOWN";

    }


    
public String toEncoding(final int type) {
        
return (javaname[type] + "," + nicename[type] + "," + htmlname[type])
                .intern();
    }



}


Encode,java(省略,见源码)


本文转自 cping 51CTO博客,原文链接:http://blog.51cto.com/cping1982/129912

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java---练习(面试题) :字符串截取(2-最终版)
Java---练习(面试题) :字符串截取(2-最终版)
37 0
Java---练习(面试题) :字符串截取(1)
Java---练习(面试题) :字符串截取(1)
39 0
Java---练习(面试题) :字符串截取(2-最终版)
在java中,字符串“abcd”与字符串“ab你好”的长度是一样,都是四个字符。 但对应的字节数不同,一个汉字占两个字节。 定义一个方法,按照指定的字节数来取子串。 如:对于“ab你好”,如果取三个字节,那么子串就是ab与“你”字的半个,那么半个就要舍弃。
1014 0
Java---练习(面试题) :字符串截取(1)
在java中,字符串“abcd”与字符串“ab你好”的长度是一样,都是四个字符。 但对应的字节数不同,一个汉字占两个字节。 定义一个方法,按照指定的字节数来取子串。 如:对于“ab你好”,如果取三个字节,那么子串就是ab与“你”字的半个,那么半个就要舍弃。
942 0
java实现office文件预览
喜欢的朋友可以关注下,粉丝也缺。        不知觉就过了这个久了,继上篇java实现文件上传下载后,今天给大家分享一篇java实现的对office文件预览功能。
3273 0
为什么java中用枚举实现单例模式会更好
代码简洁 这是迄今为止最大的优点,如果你曾经在Java5之前写过单例模式代码,那么你会知道即使是使用双检锁你有时候也会返回不止一个实例对象。虽然这种问题通过改善java内存模型和使用volatile变量可以解决,但是这种方法对于很多初学者来说写起来还是很棘手。
1263 0
JAVA实现的支付宝扫描二维码支付
JAVA实现的支付宝扫描二维码支付http://www.bieryun.com/1638.html 支付项目采用springMvc+Dubbo架构实现,只对外提供接口 前期酝酿准备 最近项目中要上线支付功能、前段时间刚开发完微信的扫码支付、不得不说微信开发团队的文档真是一个烂。
2580 0
Android JNI实现简单的c层调用Java层函数(C层调用Java层Toast进行提示)
终于建了一个自己个人小站:https://huangtianyu.gitee.io,以后优先更新小站博客,欢迎进站,O(∩_∩)O~~ 以前做过一段时间的JNI开发但是总是容易忘记一些简单的jni操作,最近重拾走过的jni开发之路,这里记录下如何在c层调用Java层类及方法,这里的类和方法可以是SDK里面的,也可以是自己编写的。
1666 0
Java后端实现websocket与微信小程序端连接简单例子
Java后端实现websocket与微信小程序端连接简单例子http://www.bieryun.com/963.html 直接附代码 前端代码:
2568 0
23703
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载