Android中的Charset检测

Wil*_*ann 2 android metadata character-encoding

我的Android应用程序检索SHOUTcast元数据并显示它.我正在使用非英语字符集.基本上,元数据显示为乱码.如何执行字符编码检测并正确显示文本?很抱歉,如果这是一个非常重要的问题,我对这个主题并不精通.

有问题的流是:http://skully.hopto.org:8000

gre*_*gko 5

正如vorrtex在上面的评论中指出的那样,如果您的数据来自格式良好的HTML代码,您可以从<meta content="...">标记中了解其编码,这是最佳方案.您可以使用以下代码将其转换为Android(或其他Java实现)字符串:

// assume you have your input data as byte array buf, and encoding
// something like "windows-1252", "UTF-8" or whatever
String str = new String(buf, encoding);
// now your string will display correctly
Run Code Online (Sandbox Code Playgroud)

如果您不知道编码 - 您将数据作为未知格式的原始文本接收 - 您仍然可以使用统计语言模型尝试算法来猜测它.我刚刚在http://site.icu-project.org/上找到了IBM 的ICU - Unicode国际组件项目,以及自由开源许可(商业用途OK).

它们提供Java和C++库.我刚刚添加了他们的Java JAR ver.51.2到我的Android项目,它就像一个魅力.我用来识别文本文件中字符编码的代码是:

public static String readFileAsStringGuessEncoding(String filePath)
{
    String s = null;
    try {
        File file = new File(filePath);
        byte [] fileData = new byte[(int)file.length()];
        DataInputStream dis = new DataInputStream(new FileInputStream(file));
        dis.readFully(fileData);
        dis.close();

        CharsetMatch match = new CharsetDetector().setText(fileData).detect();

        if (match != null) try {
            Lt.d("For file: " + filePath + " guessed enc: " + match.getName() + " conf: " + match.getConfidence());
            s = new String(fileData, match.getName());
        } catch (UnsupportedEncodingException ue) {
            s = null;
        }
        if (s == null)
            s = new String(fileData);
    } catch (Exception e) {
        Lt.e("Exception in readFileAsStringGuessEncoding(): " + e);
        e.printStackTrace();
    }
    return s;
}
Run Code Online (Sandbox Code Playgroud)

上面的Lt.dLt.e只是我对Log.d的快捷方式(TAG,"等等......").在我能提出的所有测试文件上都工作得很好.我有点担心APK文件大小 - icu4j-51_2.jar超过9 MB长,我的整个包只有2.5 MB才添加它.但很容易隔离CharsetDetector及其依赖项,所以最终我最终添加的不超过50 kB.我需要从ICU源复制到我的项目的Java类都在core/src/com/ibm/icu/text目录下,并且是:

CharsetDetector
CharsetMatch
CharsetRecog_2022
CharsetRecog_mbcs
CharsetRecog_sbcs
CharsetRecog_Unicode
CharsetRecog_UTF8
CharsetRecognizer
Run Code Online (Sandbox Code Playgroud)

此外,在CharsetRecog_sbcs.java中有一个受保护的'ArabicShaping as;' 想要拉出更多课程的成员,但事实证明,对于字符集的识别它并不需要,所以我评论了它.就这样.希望能帮助到你.

格雷格