ReadLine和扩展的ascii表的编码

Bep*_*i's 3 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(); }
Run Code Online (Sandbox Code Playgroud)

这里我称之为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
            }
}   
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Agi*_*Pro 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");
Run Code Online (Sandbox Code Playgroud)

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