HashMap破坏了编码?

3
我必须承认,我对编码等领域并不是专家。我面临以下问题:我的程序需要读取一个文本文件,其中包含不仅标准 ASCII,还包括“特殊字符和语言”,例如“..офіціалнов назвов Російска..”。因此,假设文件的内容如下:офіціалнов назвов Російска
现在,我想将整个文件内容分割成单词,并创建另一个文件,按行列出所有这些单词,例如:
  • офіціалнов
  • назвов
  • Російска
我的问题是:如果将这些单词放入 HashMap 中并从中读取值,则会丢失编码。以下是我的代码:
    final StringBuffer fileData = new StringBuffer(1000);
    final BufferedReader reader = new BufferedReader(
            new FileReader("fileIn.txt"));

    char[] buf = new char[1024];
    int numRead = 0;
    while ((numRead = reader.read(buf)) != -1)
    {
        final String readData = String.valueOf(buf, 0, numRead);
        fileData.append(readData);
        buf = new char[1024];
    }
    reader.close();
    String mergedContent = fileData.toString();


    mergedContent = mergedContent.replaceAll("\\<.*?>", " ");
    mergedContent = mergedContent.replaceAll("\\r\\n|\\r|\\n", " ");

    final BufferedWriter out = new BufferedWriter(
            new OutputStreamWriter(
                    new FileOutputStream("fileOut.txt")));

    final HashMap<String, String> wordsMap = new HashMap<String, String>();

    final String test[] = mergedContent.split(" ");


    for (final String string : test)
    {

        wordsMap.put(string, string);
    }

    for (final String string : wordsMap.values())
    {
        out.write(string + "\n");
    }


    out.close();

这段代码会破坏编码。有趣的是:如果我不把值放入HashMap而是立即将它们存储到输出文件中,就像这样:

...
        for (final String string : test)
        {
                        out.write(string + "\n");
            //wordsMap.put(string, string);
        }

        //for (final String string : wordsMap.values())
        //{
        //  out.write(string + "\n");
        //}


        out.close();

...然后它会按照我的预期工作。

我做错了什么?


似乎HashMap与此无关的可能性极小。通常,在创建FileReader和OutputStreamWriter时,应指定编码。 - Thilo
你为什么要使用HashMap而不是HashSet? - user949300
FileReader 总是假定默认编码。它的 javadoc 建议如果你不想要默认编码(通常情况下你不想要),使用 InputStreamReader - Bozho
1个回答

10
尝试使用 new InputStreamReader(new FileInputStream(file), "UTF-8"),然后对输出执行相同的操作。确保您的文件编码为UTF-8。
哈希映射无法对编码进行任何操作。

或者,如果文件不是UTF-8编码,请在InputStreamReader中指定该编码。同样的道理也适用于OutputStreamWriter。 - Thilo
我想强调的是,每当你读取一个字符时,你需要指定编码方式,否则它将使用默认的编码方式。 - Liviu T.
非常感谢Bozho!问题在于文件编码是UTF-16,但指定输入/输出流读取器/写入器编码就像魔法一样奏效。 - loteck
文件必须是UTF-8编码,这是我的问题关键所在。谢谢啦。 - Xiangyu

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