汉字编码是一项较为麻烦的事情,弄不好就会造出些谁都看不懂的乱码。比如我想做个针对汉字网站的爬虫系统,需要对非特定的页面进行数据解析处理,而此时我所访问的页面编码格式未知,如果不能正确处理页面编码,则很难获得我们理想中的数据。
通常这时候可能有几种选择:
一是根据response的ContentType获得,如果服务器支持的话此项中会返回charset数值,解析即可。但对不返回或者不支持的服务器则无能为力。
二是使用正则或自定义解析函数截取页面中‘charset=’后的数据,采取死钉战术,但万一采集的页面中没有此项或者此项有错,也就回天乏术。
三就是老老实实的解析全文,最后返回一个符合的编码格式。
此例中我演示了几种较常见编码的识别方法,通过统计编码为指定编码的或然率, 而后返回可能性最高的编码方式。在无法获得确切编码之时,这可说是一种唯一的选择。
这种识别方式主要是针对汉字编码而来,所以对应页面中的汉字数目越多,统计结果就越准确,反之则很难识别出正确结果。
package org.wing.encoding;
/** *//**
* <p>
* Title: LoonFramework
* </p>
* <p>
* Description:编码基本类型集合
* </p>
* <p>
* Copyright: Copyright (c) 2008
* </p>
* <p>
* </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();
}
}
分享到:
相关推荐
通过解析字符串获取字符串编码类型的java代码
总的来说,Java中获取字符串编码类型没有一个直接的标准方法,开发者需要借助一些技巧和外部库来实现。在处理编码问题时,理解各种编码格式的特性以及它们之间的差异至关重要,这样才能有效地避免乱码问题,保证数据...
### Java字符串编码转换详解 #### 一、Java 字符串编码转换基础 在Java中,字符串的处理是非常常见的操作之一,而字符编码是确保数据正确显示的关键因素。本篇文章将重点介绍Java中字符串编码的转换方法及其在Web...
要获取Java字符串的字节序列(即编码),可以使用`getBytes()`方法。此方法默认使用平台的默认编码,通常为UTF-8,但也可以指定其他编码,如`getBytes("GBK")`。如果需要确定字符串的原始编码,需要额外的信息,...
在Java编程语言中,字符串是极其重要且常用的数据类型,尤其在Android开发中更是不可或缺。字符串主要用于处理文本信息,如用户输入、文件内容、网络数据等。以下是对"JAVA 字符串应用笔记"中可能涉及的一些核心知识...
在Java编程语言中,字符串(String)是至关重要的数据类型,用于处理文本信息。字符串是不可变的,这意味着一旦创建,就不能更改其...通过学习和实践这些示例,开发者可以更好地掌握Java字符串操作的技巧,提升编程能力。
17. **字符串编码与解码** `getBytes()`将字符串转换为字节数组,`new String(byte[], charset)`根据字符集将字节数组还原为字符串。 18. **判断前缀与后缀** `startsWith(String prefix)`和`endsWith(String ...
在Java编程中,字符和字符串是最常见的数据类型之一。为了方便高效地处理这些数据类型,Java提供了强大的支持,包括`Character`类和`String`类等。这些类位于`java.lang`包中,无需额外导入即可使用。 #### 二、...
#### 二、Java中的字符串与字符编码 在 Java 中,`String` 类型是一种特殊的类型,它用来表示一系列字符的序列。Java 的 `String` 类内部是以 Unicode 编码存储的,这意味着每个字符都对应一个特定的 Unicode 码点...
4. **处理结果**:`detectFileEncoding`函数返回的字符串是检测到的文件编码,可以根据这个信息来决定如何读取和处理文件内容。如果返回的是“unknown”,则表示无法确定文件的编码。 通过以上步骤,我们就可以在...
字符串在各种编程语言中都是基本的数据类型,如Python中的`str`,Java中的`String`,JavaScript中的`String`等。 截取字符串通常有两种主要方法:固定位置截取和指定长度截取。 1. 固定位置截取:这种方法通常基于...
总之,Java中的字符编码是一个复杂的主题,涉及Unicode、编码解码、I/O流的使用以及字符串处理等多个方面。了解这些知识对于编写跨平台、支持多语言的程序至关重要。通过深入学习和实践,开发者可以更好地处理各种...
在Java中,字符串是一种对象类型,用于表示文本。而字节则是存储在byte数组中的基本数据类型,用来表示原始的二进制数据。由于Java默认使用Unicode字符编码,每个字符(char)占用2个字节(byte),因此对于中文字符...
在JNI中,我们使用`NewStringUTF`函数从Java字符串创建一个C的UTF-8编码的字符串,然后使用`GetStringUTFChars`获取其实际内容。在C中处理完字符串后,需要使用`ReleaseStringUTFChars`释放资源。这个过程确保了内存...
而Java中的字符串`String`是由一系列`char`组成的序列,因此在默认情况下,Java字符串本身就是基于Unicode的。 #### 三、字符集与字符编码的关系 1. **字符集**:是指一组字符的集合,比如ASCII、GBK、GB2312等。 ...
本资料将深入探讨Java字符串中常用的方法。 1. **创建字符串** - `new String()`: 通过构造函数创建,可以传入字符数组或另一个字符串。 - `""`: 字符串字面量,例如 `"Hello"`,Java会自动在字符串池中创建一个...
### 关于JAVA字符编码:Unicode, ISO-8859-1, GBK, UTF-8 编码及相互转换 在Java开发过程中,字符编码是处理文本数据的基础,不同的编码方式会影响数据的存储、传输以及显示。本文将详细介绍几种常见的字符编码...
综上所述,Java中的字符赋值涉及到变量声明、转义序列、Unicode编码、字符串与字符转换、字符操作以及I/O流等多个方面。在实际编程中,理解和熟练运用这些概念对于编写高效且可读性强的代码至关重要。
Java字符串处理是编程中常见的任务,这里我们详细讨论一下Java中字符串截取及相关方法。 1. `length()`:此方法返回字符串的长度,即字符的数量。例如,`s.length()`会返回字符串`s`中字符的个数。 2. `charAt(int...
16. **获取字符串编码** - `getBytes()`: 获取字符串的字节数组,使用平台默认编码。 - `getBytes(Charset charset)`: 指定字符集获取字节数组。 17. **字符串反转** - `reverse()`: 反转字符串中的字符顺序。 ...