Java:检测给定字符编码的不可显示字符

时间:2010-09-01 14:11:40

标签: java csv utf-8 character-encoding validation

我目前正在开发一个应用程序来验证和解析CSV文件。 CSV文件必须以UTF-8编码,尽管有时我们会以错误编码方式获取文件。 CSV文件很可能包含德语字母(Ä,Ö,Ü,ß)的特殊字符,因为CSV文件中的大部分文本都是德语。

对于验证器的一部分,我需要确保该文件是UTF-8编码的。只要不存在特殊字符,解析时很可能没有问题。

到目前为止,我所尝试的是将文件作为字节读取并使用一些库来检测(或猜测)编码。我尝试了这篇博文的大部分可能性:http://fredeaker.blogspot.com/2007/01/character-encoding-detection.html

但我尝试的所有库都没有返回正确的编码,因此我无法解析特殊字符。

现在我的问题: 有没有办法确定像UTF-8这样的给定字符编码来检测未正确编码的字符?所以基本上(Eclipse)控制台中显示的字符为问号。

或者还有其他方法可以正确确定字符编码吗? 我只需要知道它是否是UTF-8。

先谢谢大家的帮助! :)

最诚挚的问候, 罗伯特

2 个答案:

答案 0 :(得分:6)

无法正确解码的字节序列将替换为“替换字符”\uFFFD,其显示如下: 。但是,如果输出设备不支持该字符,则可能会使用问号(?)代替。

因此,在将UTF-8数据解码为String个对象后,搜索\uFFFD的出现次数。

或者,如果您设置了InputStreamReader,其中包含您自己创建的CharsetDecoder实例,则可以获得更多控制权。例如,您可以指定如果任何无法解码的字节序列,则应引发Exception。或者你可以忽略它们。或者,您可以指定其他字符作为替换字符。

答案 1 :(得分:1)

如果文本是德语并且编码不是UTF-8,则可能是windows-1252。或者与windows-1252兼容的东西,比如ISO-8859-15。既然如此,Laforge的GuessEncoding应该就是您所需要的。我已经使用了很多,从来没有遇到任何问题,而且几乎只使用英文文本;德语应该更容易被发现。

我发现他仍然没有在他的博客或源文件中指定许可证,但我知道这些类在Groovy中使用,所以这应该不是问题。