0

我正在构建一个应用程序,用户必须在其中猜测一个秘密单词。我在资产文件夹中有 *.txt 文件。问题是单词是阿尔巴尼亚语。我们的语言使用像“ë”和“ç”这样的字母,所以每当我尝试从文件中读取包含任何这些字符的单词时,我都会得到一些邪恶的符号,我无法为这些字符实现 string.compare()。我尝试了许多使用 UTF-8 的选项,更改了 Eclipse 设置,但仍然出现相同的错误。

如果有人有任何建议,我将不胜感激。

我用来读取文件的代码是:

AssetManager am = getAssets();
strOpenFile = "fjalet.txt";

InputStream fins = am.open(strOpenFile);

reader = new BufferedReader(new InputStreamReader(fins));

ArrayList<String> stringList = new ArrayList<String>();

while ((aDataRow = reader.readLine()) != null) {
    aBuffer += aDataRow + "\n";
    stringList.add(aDataRow);           
}

否则代码工作正常,除了提到的字符

4

3 回答 3

3

很明显,创建文件时生效的默认编码InputStreamReader与文件不匹配。

如果您尝试读取的文件是 UTF-8,那么这应该可以工作:

reader = new BufferedReader(new InputStreamReader(fins, "UTF-8"));

如果文件不是 UTF-8,那么这将不起作用。相反,您应该使用文件真实编码的名称。(我的猜测是它在ISO/IEC_8859-1ISO/IEC_8859-16中。)


一旦你弄清楚了文件的真正编码是什么,你需要试着理解为什么它不符合你的 Java 平台的默认编码......然后就如何处理它做出务实的决定。(您是否应该将编码硬连接到您的应用程序中......如上所述?您应该将其设为配置属性还是命令参数?您应该更改默认编码吗?您应该更改文件吗?)

于 2012-12-02T14:51:22.583 回答
1

您需要确定创建文件时使用的字符编码,并在读取文件时指定此编码。例如,如果是 UTF-8,请使用

reader = new BufferedReader(new InputStreamReader(fins, "UTF-8"));

或者

reader = new BufferedReader(new InputStreamReader(fins, StandardCharsets.UTF_8));

如果您在 Java 7 下。

像 Notepad++ 这样的文本编辑器具有很好的启发式方法来猜测文件的编码是什么。尝试用这样的编辑器打开它,看看它猜到了哪种编码(如果字符显示正确)。

于 2012-12-02T14:50:50.957 回答
1

您应该知道文件的编码。

InputStream类读取文件二进制文件。尽管您可以将输入解释为字符,但这将是隐含的猜测,这可能是错误的。

InputStreamReader类将二进制转换为字符。但它应该知道字符集。

您应该使用以下版本按字符集提供它。

更新

不要建议你有 UTF-8 编码的文件,这可能是错误的。在俄罗斯,我们有 CP866、WIN1251 和 KOI8 等编码,它们都与 UTF8 不同。可能你有一些流行的阿尔巴尼亚文本文件编码。检查您的操作系统设置以猜测。

于 2012-12-02T14:55:39.077 回答