我的Android应用程序检索SHOUTcast元数据并显示它。我正在使用非英语字符集。基本上,元数据显示为乱码。如何执行字符编码检测并正确显示文本?很抱歉,如果这是一个非常重要的问题,我对这个主题并不精通。
相关信息流为:http://skully.hopto.org:8000
答案 0 :(得分: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
如果您不知道编码 - 您将数据作为未知格式的原始文本接收 - 您仍然可以使用统计语言模型尝试算法来猜测它。我刚刚在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;
}
上面的Lt.d 和 Lt.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
另外在CharsetRecog_sbcs.java中有一个受保护的'ArabicShaping as;'想要拉出更多课程的成员,但事实证明,对于字符集的识别它并不需要,所以我评论了它。就这样。希望它有所帮助。
格雷格