在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_字符编码.txt Javajava_字符编码问题
JAVA中文字符编码问题详解.doc JAVA中文字符编码问题详解.doc
通用的文件字符编码集判断需要借助第三方包cpdetector.jar 使用Cpdetector jar包检测文件编码需要依赖antlr-2.7.7.jar、chardet-1.0.jar、jargs-1.0.jar三个jar包 本下载资源一站式全包含,并附带亲测有效的片段...
一个详细的讲解JAVA_字符编码的例子 希望可以帮助到你。
Java中文字符编码探究
字符编码检测和转换 附件中:FileEncodeDetector.java 此文件可以检测指定文件的编码格式 public static String getFileEncode(File file) {...} 附件中:FileCharsetConverter.java 此文件可以实现两个编码的相互...
Java字符集和编码 ,Java字符集和编码Java字符集和编码
java字符编码监听器
主要介绍了java 使用 URLDecoder 和 URLEncoder 对中文字符进行编码和解码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Java中的字符集编码入门(五)Java代码中的字符编码转换Part1.pdf
java字符串编码转换和web中的字符串转换
深度剖析Java的字符编码.深度剖析Java的字符编码.
java字符串的各种编码转换. java字符串的各种编码转换
NULL 博文链接:https://joard.iteye.com/blog/403031
通过解析字符串获取字符串编码类型的java代码
利用字符间的转化把汉字转化为英文字符主要应用于提取汉字的首字母等要求
不需要关心接受的字符串编码是UTF_8还是GBK,还是ios-8859-1,自动转换为utf-8编码格式,无需判断字符串原有编码,用法://处理编码String newStr = GetEncode.transcode(oldStr);
java字符集编码乱码详解
java 写的字符编码转换工具(附带源码) java 写的字符编码转换工具(附带源码) java 写的字符编码转换工具(附带源码)
java 字符编码问题,遇到各种乱码问题可以参考此文档,十分全面