【问题标题】:Java: Detect non-displayable chars for a given Character EncodingJava:检测给定字符编码的不可显示字符
【发布时间】:2011-04-06 20:17:43
【问题描述】:

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

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

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

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

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

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

提前感谢大家的帮助! :)

最好的问候, 罗伯特

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 我从一个关键事件中获得了char 的击键,并且每个不可显示的字符都是\uFFFF
    • @Qbyte Key 事件不使用字符编码。这个问题(和答案)不适用于 GUI 中的键盘输入,但仅适用于需要将字符转换为字节以进行传输或存储的情况。
    • @erickson 这个问题的标题与我搜索的内容最匹配。我只是想添加此评论,以便其他人也可以尝试使用\uFFFF
    • @Qbyte 如果您看到'\uFFFF',那是因为您的代码存在一些独特的错误。您可以通过minimal reproducible example 提出一个新问题,以了解这些无效字符的来源。 \uFFFF 不是有效字符;如果您正在从文件或流中读取,我猜您正在将 EOF (-1) 转换为 char,但由于您不是,我很想知道发生了什么。
    • @erickson 更具体地说:我从“处理”库中的PAppletkey 属性中获取这些字符。这个key\uFFFF,如果我输入一些不可显示的字符,比如shift、左箭头等等。所以它可能只是处理。
    【解决方案2】:

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

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

    【讨论】:

    • 非常感谢您的回答!我明天试试:)
    猜你喜欢
    • 2021-11-21
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 2012-11-09
    • 2013-04-01
    • 1970-01-01
    相关资源
    最近更新 更多