美好的一天。
我有一个带西班牙语单词的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是¥。再次,不是事件亲属我需要的。
所以......请帮帮我! :(
答案 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表示的字符Ñ。