java字符串编码类型获取

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:
源码下载地址:[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
相关文章
|
3月前
|
Java
Java实现随机生成某个省某个市的身份证号?如何编码?
【10月更文挑战第18天】Java实现随机生成某个省某个市的身份证号?如何编码?
191 5
|
2天前
|
自然语言处理 Java
Java中的字符集编码入门-增补字符(转载)
本文探讨Java对Unicode的支持及其发展历程。文章详细解析了Unicode字符集的结构,包括基本多语言面(BMP)和增补字符的表示方法,以及UTF-16编码中surrogate pair的使用。同时介绍了代码点和代码单元的概念,并解释了UTF-8的编码规则及其兼容性。
74 60
|
2月前
|
SQL Java 索引
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
144 83
|
2月前
|
存储 安全 Java
Java零基础-字符串详解
【10月更文挑战第18天】Java零基础教学篇,手把手实践教学!
112 60
|
2月前
|
Java 数据库
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
59 26
|
2月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
62 8
|
2月前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
53 6
|
2月前
|
存储 Java 开发者
Java 中 Set 类型的使用方法
【10月更文挑战第30天】Java中的`Set`类型提供了丰富的操作方法来处理不重复的元素集合,开发者可以根据具体的需求选择合适的`Set`实现类,并灵活运用各种方法来实现对集合的操作和处理。
|
2月前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
84 2
|
2月前
|
存储 Java 编译器
Java泛型类型擦除以及类型擦除带来的问题
泛型擦除是指Java编译器在编译期间会移除所有泛型信息,使所有泛型类型在运行时都变为原始类型。例如,`List&lt;String&gt;` 和 `List&lt;Integer&gt;` 在JVM中都视为 `List`。因此,通过 `getClass()` 比较两个不同泛型类型的 `ArrayList` 实例会返回 `true`。此外,通过反射调用 `add` 方法可以向 `ArrayList&lt;Integer&gt;` 中添加字符串,进一步证明了泛型信息在运行时被擦除。
49 2