ReadLine和扩展的ascii表的编码

时间:2013-02-14 22:30:06

标签: java android

美好的一天。

我有一个带西班牙语单词的ASCII文件。它们只包含A和Z之间的字符,加上Ñ,ASCII代码165(http://www.asciitable.com/)。 我得到这个源代码的文件:

InputStream is = ctx.getAssets().open(filenames[lang_code][w]);
InputStreamReader reader1 = new InputStreamReader(is, "UTF-8");
BufferedReader reader = new BufferedReader(reader1, 8000);

try {
    while ((line = reader.readLine()) != null) {
                 workOn(line);
                 // do a lot of things with line
            }
    reader.close();
    is.close();
} catch (IOException e) { e.printStackTrace(); }

这里我称之为workOn()是一个应该从字符串中提取字符代码的函数,就像这样:

    private static void workOn(String s) {      
    byte b;
    for (int w = 0; w < s.length(); w++) {
        b = (byte)s.charAt(w);
                    // etc etc etc
            }
}   

不幸的是,这里发生的事情是,当它代表Ñ字母时,我无法将b识别为ASCII码。 b的值对于任何ascii字母都是正确的,并且在处理Ñ时返回-3,带来签名的是253,或ASCII字符²。没有类似于Ñ...

这里发生了什么?我该如何获得这个简单的ASCII码?

令我生气的是我无法找到正确的编码。甚至,如果我去浏览UTF-8表(http://www.utf8-chartable.de/)Ñ是209dec而253dec是ý,165dec是¥。再次,不是事件亲属我需要的。

所以......请帮帮我! :(

1 个答案:

答案 0 :(得分:8)

您确定要阅读的源文件是UTF-8编码的吗?在UTF-8编码中,所有大于127的值都保留用于多字节序列,并且它们永远不会独立存在。

我的猜测是,您正在阅读的文件使用“代码页237”进行编码,这是原始的IBM PC字符集。在该字符集中,Ñ由小数165表示。

许多现代系统使用ISO-8859-1,它恰好相当于Unicode字符集的前256个字符。在那些中,Ñ字符是十进制的209.在评论中,作者澄清说209实际上在文件中。

如果文件真的是UTF-8编码,那么Ñ将表示为一个双字节序列,并且既不是值165也不是值209。

基于上述假设文件是​​ISO-8859-1编码,您应该能够通过使用以下方法解决问题:

InputStreamReader reader1 = new InputStreamReader(is, "ISO-8859-1");

这将转换为Unicode字符,然后您应该找到由decimal 209表示的字符Ñ。