`
单眼皮大娘
  • 浏览: 112789 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

java 中文字符编码的思维定式

    博客分类:
  • java
阅读更多
在JAVA代码中,总想写下面的代码:
myString.getCharsetName()
,也就是想获取字符串的当前编码,可是根本没有这样的方法。

    在写代码时,很有可能遇到这样的情况:读取一个文件(假设文件的编码是GBK),本地环境为UTF-8,按照默认的方式读取后发现出现了乱码,于是想把读入的字符串编码格式转换成UTF-8,在调用如下的方法:
new InputStreamReader(_inputStream, “UTF-8”)
,发现最后还是出现乱码。

    这就是思维定式的后果,我们总认为给的参数就是显示提醒我们创建该流后的字符编码为指定字符编码,包括在用
String(byte[],charset)
方法时,也是认为charset就是我们最终想要的字符编码,可是事实上却不是如此,否则上述情况也不会出现乱码。

    当获取字符串(String类型)后,我们实际上已经无能为力了,该字符串已经按照系统默认的类型进行了编码(假如是GBK的话,本地为UTF-8,那么再怎么进行字符转化,在本地也都会出现乱码)。

    其实对于字符编码格式的转换,JAVA不需要进行刻意的转换,但是一定要正确的解析,上面的那些编码实际上起到的作用是指导本地JVM解析字符串,正确的给出字符串原始编码,那么在本地上会自动的转换成本地编码格式。

    下面为测试代码:再没有正确的指定编码方式,读入本地输出为乱码

   
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;

public class StringUtils {

	public static StringBuilder getStringFromStream(InputStream inputStream, String charsetDeclared) {
		InputStream _inputStream = CharEncodingUtils.makeRepeatableInputStream(inputStream);
		_inputStream.mark(40960);
		String charsetChecked = CharEncodingUtils.detectCharSet(_inputStream);
		System.out.println(charsetChecked);
		try {
			_inputStream.reset();
		}
		catch (IOException e1) {
			e1.printStackTrace();
		}
		StringBuilder streamContent = new StringBuilder();
		try {
			InputStreamReader streamReader = null;
			if (charsetChecked != null) {
				streamReader = new InputStreamReader(_inputStream, charsetChecked);
			} else if (charsetDeclared != null && Charset.isSupported(charsetDeclared)) {
				streamReader = new InputStreamReader(_inputStream, charsetDeclared);
			} else {
				streamReader = new InputStreamReader(_inputStream);
			}
			BufferedReader bufferReader = new BufferedReader(streamReader);
			String aLine = null;
			while ((aLine = bufferReader.readLine()) != null) {
				aLine = CharEncodingUtils.toDBC(aLine);
				streamContent.append(aLine).append("\n");
			}
	
			{
				bufferReader.close();
				streamReader.close();
				inputStream.close();
			}
		}
		catch (IOException e) {
		}
	
		return streamContent;
	}
	
	public static void main(String[] args) throws FileNotFoundException {
		FileReader reader = new FileReader(new File("F:/corpus/testIK/ik.txt"));
		BufferedReader bufferedReader = new BufferedReader(reader);
		String line;
		StringBuilder stringBuilder = new StringBuilder();
		
		try {
			while ((line = bufferedReader.readLine()) != null) {
				stringBuilder.append(line).append("\n");
			}
			String string = stringBuilder.toString();
			System.out.println(string);
		}
		catch (IOException e) {
			e.printStackTrace();
		}
	}
}

    

注意:main函数中没有调用上述的方法。本地为UTF-8,文件为GBK编码

输出:
引用

����Ѷ(��������)���Ԥ�8��ܾ���վ���쿯�Ǹþָ��ֳ��޺���11�������n�����������ʻ����ϵķ��ԡ��޺���͸¶����ȥ30�꣬�й���420��������Ա�ܴ��֣�����90����ʡ������Ա��̰����׷��˾�����Ρ�


当改变Main方法后,代码如下:
public static void main(String[] args) throws FileNotFoundException {
		/*FileReader reader = new FileReader(new File("F:/corpus/testIK/ik.txt"));
		BufferedReader bufferedReader = new BufferedReader(reader);
		String line;
		StringBuilder stringBuilder = new StringBuilder();
		
		try {
			while ((line = bufferedReader.readLine()) != null) {
				stringBuilder.append(line).append("\n");
			}
			String string = stringBuilder.toString();
			System.out.println(string);
		}
		catch (IOException e) {
			e.printStackTrace();
		}*/
		StringBuilder stringFromStream = StringUtils.getStringFromStream(new FileInputStream(new File("F:/corpus/testIK/ik.txt")), null);
		System.out.println(stringFromStream.toString());
	}

   
输出如下:
引用

GB18030
当今自然语言处理中最见成效而且被普遍应用的是统计方法这不仅是因为自然语言普遍存在不确定性,传统的理性主义规则方法显得力不从心而且从人力资源的成本和经济效益来看,语料库方法受到普遍的青睐尤其在重现频率高、实际使用面广泛的专用领域的机器翻译中




代码中没有可以的编码转换,只是检测出原始的代码为GB18030,然后用这个charset为参数,调用对应的流式函数,最后输出没有乱码。
分享到:
评论

相关推荐

    JAVA中文字符编码问题详解.doc

    JAVA 中文字符编码问题详解 在 JAVA 中,中文字符编码问题一直是让人头疼的问题,特别是在 WEB 应用中。网上的分析文章和解决方案都很多,但总是针对某些特定情况的。本文将详细解释 JAVA 中文字符编码问题的根源,...

    Java中文字符编码探究.pdf

    这篇论文通过大量的实验和编码知识支持,探索了Java在不同介质中对汉字的编码,解决了以不同字符集读写文件时中文乱码的问题,以及在B/S结构表单中提交中文乱码的处理问题。 在Java中,字符编码是非常重要的。Java...

    java_字符编码 Javajava_字符编码问题

    ### Java 字符编码详解 #### 一、Java 字符编码基础概念 在深入探讨 Java 字符编码的问题之前,我们先来了解一下字符编码的基本概念。字符编码是计算机内部表示字符的一种方式,它涉及到如何将人类可读的文字转换...

    java文件字符编码检测和转换

    字符编码检测和转换 附件中:FileEncodeDetector.java 此文件可以检测指定文件的编码格式 public static String getFileEncode(File file) {...} 附件中:FileCharsetConverter.java 此文件可以实现两个编码的相互...

    JAVA_字符编码

    在Java编程语言中,字符编码是一个至关重要的概念,它涉及到如何表示、存储和处理文本数据。字符编码系统如ASCII、ISO-8859-1、Unicode(包括UTF-8、UTF-16等)被广泛使用。本教程将深入探讨Java中的字符编码,以及...

    java使用URLDecoder和URLEncoder对中文字符进行编码和解码

    在Java编程语言中,`URLDecoder`和`URLEncoder`是两个非常重要的工具类,主要用于处理URL中的中文字符和其他特殊字符。这两个类位于`java.net`包下,可以帮助开发者进行字符串编码和解码,确保数据在网络传输过程中...

    JAVA 转换字符编码工具

    `JAVA 转换字符编码工具`可能是一个用于处理字符编码转换的Java程序,旨在帮助开发者解决不同编码格式之间转换的问题。这篇博文链接(虽然没有提供具体内容)可能详细介绍了这个工具的实现原理和使用方法。 在Java...

    Java字符集和编码

    ### Java字符集和编码 #### 一、引言 在探讨Java字符集和编码之前,我们先了解一下为什么在Java编程中需要关注字符集和编码。Java作为一种广泛应用的编程语言,其内部采用的是Unicode编码,这使得Java能够很好地...

    java获取字符串编码类型代码(导入直接查看结果)

    在Java编程语言中,处理字符串时,了解字符串的编码类型是非常重要的。编码类型决定了字符集,它定义了如何将字符转换为数字(字节)以及如何将数字转换回字符。常见的编码类型有ASCII、ISO-8859-1、UTF-8、GBK等。...

    java字符集编码问题

    假设有一个字符串“中文”,其在Java中的Unicode编码为“4e2d 6587”。我们可以通过以下步骤来理解Java如何处理这个字符串: 1. **转换为GBK编码** 使用`getBytes("GBK")`方法,可以得到“中文”的GBK编码,即...

    java 字符串中文判断

    本文将深入探讨如何在Java中进行中文字符的判断和计数,这主要基于Java的Unicode编码特性以及字符集的理解。 首先,我们需要理解Java中的字符类型`char`。在Java中,一个`char`类型的变量可以存储一个Unicode字符,...

    JAVA及相关字符集编码问题

    JAVA及相关字符集编码问题 在深入探讨JAVA与字符集编码问题之前,我们首先需要理解不同字符集编码的基本概念以及它们在JAVA环境中的应用。字符集编码是计算机系统中表示文字的一种方式,它决定了如何将字符转换为二...

    JAVA字符编码系列三[借鉴].pdf

    Java字符编码系列三主要探讨了Java应用中遇到的编码问题,包括编码基础知识、Java与系统软件、URL、工具软件等方面的处理。文章通过“中文”二字举例,解释了不同编码方式如GB2312、Unicode、UTF-8的表示方法。 1. ...

    java获取字符串编码类型代码

    通过解析字符串获取字符串编码类型的java代码

    JAVA里字符编码的探索与理解.txt

    ### JAVA里字符编码的探索与理解 #### 一、引言 在计算机科学领域,字符编码是将人类可读的文本转换为计算机可以处理的数据格式的过程。JAVA作为一种广泛使用的编程语言,尤其注重国际化和多语言支持,因此采用了...

    关于JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换

    ### 关于JAVA字符编码:Unicode, ISO-8859-1, GBK, UTF-8 编码及相互转换 在Java开发过程中,字符编码是处理文本数据的基础,不同的编码方式会影响数据的存储、传输以及显示。本文将详细介绍几种常见的字符编码...

    java 中文Unicode转换

    在Java编程语言中,Unicode编码是一种广泛使用的字符集,它包含了世界上几乎所有的文字,包括中文。Unicode使得在程序中处理不同语言的文本变得更加方便。本文将深入探讨如何在Java中进行中文字符到Unicode编码的...

Global site tag (gtag.js) - Google Analytics