重点又回到了国人都很烦恼的字符编码问题,真羡慕老外们。不过作为国际化的程序,字符编码问题也是一个必不可少的环节。
在通常情况,我们处理上传的文件都是十分简单流畅的,因为普通情况下的大家的平台都是仿佛,文件的字符编码都是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)。
分享到:
相关推荐
本工程用于研究如何使用Java代码获取文件、文件流或字符串的编码方式 本工程编码方式:UTF-8 开发工具:MyEclipse 参考博客:http://blog.csdn.net/gaohuanjie/article/details/43735891
在Java中,`java.nio.charset.Charset`类用于表示字符编码,但默认情况下,Java文件读取操作通常假设文件为UTF-8编码。对于其他编码,我们需要借助第三方库如`jcconf`或`ICU4J`来检测编码。 ```java import ...
本文将深入探讨如何在C#环境中读取文本文件以及涉及到的字符编码问题。字符编码是理解文本数据的关键,尤其是在多语言环境下,它确保了不同语言字符的正确显示。 首先,我们来看C#中读取文本文件的基本方法。C#提供...
**实现思路**:在前端上传文件之前,通过正则表达式等方式对文件名进行校验,确保不含有特殊字符。这种方法简单易行,开发成本低。 **优点**: - 实现简单,只需对文件名进行简单的检查即可。 - 避免了后续一系列的...
在这个场景中,我们关注的是"js弹出窗口 + 获取上传文件全路径"的主题。这涉及到两个主要的知识点:JavaScript创建弹出窗口以及获取文件的完整路径。 首先,让我们详细探讨JavaScript创建弹出窗口。在Web开发中,弹...
在开发Web应用时,我们经常遇到需要用户上传文件的需求。标题提到的“上传文件fileupload+解决enctype= multipart/form-data无法传递其他参数”是一个常见的技术挑战,特别是当使用HTML表单进行文件上传时。`...
关于application/x-www-form-urlencoded等字符编码的解释说明 application/x-www-form-urlencoded是HTML表单提交时使用的最常见的编码格式,它将窗体数据编码为名称/值对。这种编码格式是标准的编码格式,广泛应用...
2. **字符集分析**:通过对文件内容进行统计分析,如频度最高的字符、异常字符等,可以推断出文件可能的编码。Java的`CharsetDetector`类(在`com.google.i18n.punycode`包中)提供了这种功能。 3. **第三方库**:...
在传统的HTTP上传方式中,由于其请求-响应模型的限制,多文件上传往往需要多次HTTP请求,而且无法实时获取上传进度。而HTML5引入了File API,允许我们更灵活地处理用户选择的文件,包括读取文件内容、分割大文件等。...
在处理文件上传时,常见的乱码问题通常与字符编码设置有关。在使用Jersey时,我们需要确保所有请求和响应的编码统一为UTF-8,以避免中文字符乱码。以下是一些关键步骤: 1. 配置服务器编码:在Web服务器(如Tomcat...
在这个任务中,将文件数据转化为适合网络传输的格式,如字节数组或Base64编码字符串。 3. 使用HTTP库:为了发送HTTP请求,可以使用如OkHttp、Volley或Retrofit等库。它们提供了方便的方法来发送POST请求,并携带...
然后使用FileReader对象的`readAsDataURL()`方法将文件内容转化为Base64编码的字符串,以便在浏览器中显示: ```javascript const input = document.querySelector('input[type="file"]'); input.addEventListener...
在Java Web开发中,JSP(JavaServer Pages)常常用于创建动态网页,配合Servlet处理用户交互,例如文件的上传和下载。...通过这个项目,开发者可以学习到如何优雅地处理文件I/O、HTTP响应以及字符编码问题。
使用`ServletFileUpload`的`parseRequest(request)`方法解析请求,获取上传文件的列表。如果文件尺寸超出限制,程序会捕获`SizeLimitExceededException`异常并给出提示。如果没有文件被选择,或者文件列表为空,也会...
- `getUploadFileName()` 和 `getFileSize()`:获取上传文件的名称和大小。 - `setUploadDirectory(String s)`:设置文件上传的目标目录。 - `setContentType(String s)`:设置内容类型,用于解析文件边界。 - `...
本教程将详细讲解如何在uniapp中实现文件上传功能,特别是针对Android和iOS设备,以及如何处理不同类型的文件,如PDF、Word和TXT,并将它们转换为Base64编码。 首先,我们需要了解uniapp的基础。uniapp基于Vue.js,...
在Java Web开发中,JSP...总的来说,Java Web开发中的文件上传涉及到前端JSP页面的表单设计、后端Servlet的接收和处理,以及字符编码的正确转换。理解这些知识点可以帮助开发者在遇到类似问题时迅速找到解决方案。
这是因为HTTP协议本身并不处理字符编码,而是依赖于上层的应用层协议(如HTTP头或者POST数据)来处理字符集。当涉及到非ASCII字符,如中文,不正确的编码处理会导致乱码。微软提供的CHttpConnect类在处理这种场景时...
在前端开发中,layui是一个...这些知识点对于前端开发者来说非常重要,尤其在处理用户上传文件的场景下,能够有效提升用户体验并优化服务器资源。通过实践和理解这些技术,我们可以构建更加高效、友好的文件上传功能。
`readAsDataURL()`方法可以将文件内容转换为base64编码的字符串,然后插入到页面中。 5. **进度条显示**: 通过监听`progress`事件,可以获取文件上传的进度信息,实时更新进度条,提升用户体验。 6. **错误处理与...