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 代表 Ñ 字母时,我无法将 b 识别为 ASCII 码。b 的值对于任何 ascii 字母都是正确的,并且在处理 Ñ 时返回 -3,即带符号的 253 或 ASCII 字符 ²。没有什么类似于Ñ...

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

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

所以……请帮帮我!:(

4

1 回答 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 表示的字符 Ñ。

于 2013-02-14T22:57:11.593 回答