获取上传文件的字符编码

重点又回到了国人都很烦恼的字符编码问题,真羡慕老外们。不过作为国际化的程序,字符编码问题也是一个必不可少的环节。

在通常情况,我们处理上传的文件都是十分简单流畅的,因为普通情况下的大家的平台都是仿佛,文件的字符编码都是GBK或者说是GB18030。

但还是有例外的,就是当程序遇到UTF8等其他编码格式的文件,就会可能出现乱码的情况。

众所周知,使用InputStreamReader等读取流的时候都需要加上一个文件的默认编码,确保解析文件时候不会出现乱码,但加默认编码的时候如果跟文件本身编码不同,就会造成乱码的原因了。而通常情况下,我们会加上GBK,或者GB2312或GB18030,但还是远远不够的。

今天工作时就遇到这么一个头疼的问题了,遇到需要解析的文件是一个UTF8的文件。而通常大家遇到的情况还是在解析用户上传文件的时候吧。

废话也少说了,我们需要的就是一个能根据上传文件,或者说IO流来查找字符编码的方法。

尝试和搜索了很多方法后终于找到了她---cpDetector。是一个开源项目,具体地址http://cpdetector.sourceforge.net/ 写这篇日志为止最新版本是1.0.7相关类库加起来500k不到,不过体型也算一般了。它里面包含mozilla基金会的一个Firefox用来自动探测编码的库。使用探测编码类库可以让我们探测各种类型文件的编码类型。觉得是在中文环境下,甚至可以说是国际化环境下必不可少的工具类。

具体使用方式参考如下:


/**
* <p>
* Try to get file character ending.
* </p>
* <strong>Warning: </strong>use cpDetector to detect file's
* encoding.
*
* @author KennyLee
* @return String, CharacterEnding Name.
*/
public static String getFileCharacterEnding(InputStream ios) {

String fileCharacterEnding = "GBK";

CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();
detector.add(new ParsingDetector(false));
detector.add(JChardetFacade.getInstance());
detector.add(ASCIIDetector.getInstance());
detector.add(UnicodeDetector.getInstance());
java.nio.charset.Charset charset = null;

try {
charset = detector.detectCodepage(ios, ios.available());
} catch (IllegalArgumentException e) {
log.error(e.getMessage());
} catch (IOException e) {
log.error(e.getMessage());
} finally {
if (ios != null) {
try {
ios.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

if (charset != null)
fileCharacterEnding = charset.name();

return fileCharacterEnding;
}


注意:记得导入附件中的antlr.jar、chardet.jar和cpdetector_1.0.7.jar

其中说明的是: detector.detectCodepage(ios, ios.available())

这个方法可选,如果可以得到URL的话最好是使用detectCodepage(URL url)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值