ReadLine和扩展ASCII表的编码

3

您好。

我有一个包含西班牙单词的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
你能否使用十六进制编辑器或其他显示原始字节的工具查看文件?我怀疑253不是文件中的一个字节(因为你正在将流读取为UTF-8)。 - Anton Kovalenko
是的,可能吧...那就是我的问题了:/ - Beppi's
正如你建议的那样,我使用十六进制编辑器查看了文件。我在文件中找到的字符编码为209。 - Beppi's
请注意,"ASCII代码165"并不存在。 ASCII仅定义了0-127的代码; 128-255的代码仅在扩展ASCII的编码(如CP1252,ISO 8859-1)中定义,因此它们的含义取决于您使用的编码。 - sleske
1个回答

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字符,然后您应该可以找到由十进制209表示的Ñ字符。


我在Android上工作,遇到了不支持的编码异常。我在哪里可以找到所有可能的编码? - Beppi's
@BeppiMenozzi 答案的作者认为您的文件包含字节253,因此他认为它可能是一些晦涩的IBM PC代码页。现在我们知道它是209,因此"ISO-8859-1"是正确的参数(我希望它能得到普遍支持)。 - Anton Kovalenko
谢谢Anton,看起来终于可以工作了。那么,当处理其他字符(如û或Ü)时,我是否应该使用相同的代码页? - Beppi's
1
@BeppiMenozzi 任何字符数据转码成八位字节将被编码为数十种编码之一。如果您有一个“纯文本”文件,但不知道编码方式,则存在错误。最好强制使用编码(通常为UTF-8)或使用自描述数据格式(例如JSON、XML等...)。 - McDowell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接