如何摆脱使用 UTF-8 编码的 .text 中的 "Rogue Chars"

How to get rid of "Rogue Chars" in an .txt encoded under UTF-8

我的程序正在读取使用 UTF-8 编码的 .txt。我使用 UTF-8 的原因是为了处理字符 åäö。我遇到的问题是,当读取这些行时,似乎有一些 "rogue" 字符潜入字符串,这在我尝试将这些行存储到变量中时会导致问题。这是代码:

public void Läsochlista()
{
    String Content = "";
    String[] Argument = new String[50];
    int index = 0;
    Log.d("steg1", "steg1");
    try{
        InputStream inputstream = openFileInput("text.txt");
        if(inputstream != null)
        {
            Log.d("steg2", "steg2");
            //InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
            //BufferedReader bufferreader = new BufferedReader(inputstreamreader);
            BufferedReader in = new BufferedReader(new InputStreamReader(inputstream, "UTF-8"));
            String reciveString = "";
            StringBuilder stringbuilder = new StringBuilder();

            while ((reciveString = in.readLine()) != null)
            {
                Argument[index] = reciveString;
                index++;
                if(index == 6)
                {
                    Log.d(Argument[0], String.valueOf((Argument[0].length())));
                    AllaPlatser.add(new Platser(Float.parseFloat(Argument[0]), Float.parseFloat(Argument[1]), Integer.parseInt(Argument[2]), Argument[3], Argument[4], Integer.parseInt(Argument[5])));
                    Log.d("En ny plats skapades", Argument[3]);
                    Arrays.fill(Argument, null);
                    index = 0;
                }
            }
            inputstream.close();
            Content = stringbuilder.toString();
        }
    }
    catch (FileNotFoundException e){
        Log.e("Filen", " Hittades inte");
    } catch (IOException e){
        Log.e("Filen", " Ej läsbar");
    }
}

现在,我收到错误

Invalid float: "61.193521"

该行仅包含字符“61.193521”。当我打印出程序中读取的字符串长度时,输出显示“10”,这比字符串应该包含的字符多一个。问题;我如何摆脱那些不可见的 "Rouge" 字符?为什么他们会在那里?

当您将文件另存为 "UTF-8" 时,您的编辑器可能会在文件开头写一个 byte-order mark (BOM)

查看您的编辑器中是否有一个选项可以保存不带 BOM 的 UTF-8。

显然 BOM 只是一个难题:What's different between UTF-8 and UTF-8 without BOM?

我知道您希望能够在数据中包含扩展字符;但是,您可能想要选择不同的编码,例如 Latin-1 (ISO 8859-1)。

或者您可以在用 reader.

包装输入流之前读取并丢弃前三个字节

很遗憾,您没有提供示例文本文件,因此无法准确地使用您的代码进行测试,这里是基于猜测的理论答案,可能是什么原因: 看起来这是与 BOM 相关的问题,您可能需要处理这个问题。此处提供了一些相关详细信息:http://www.rgagnon.com/javadetails/java-handle-utf8-file-with-bom.html 这里有一些信息:What is XML BOM and how do I detect it?

基本上有以下几种情况:

  1. 在其中一种情况下,当我们没有使用正确的编码进行读写时会遇到问题。
  2. 在另一种情况下,我们使用不支持 UTF-8 的编辑器或 reader
  3. 第三,当我们使用正确的编码进行读写时,我们不会在文本编辑器中面临问题,而是在其他应用程序或程序中面临问题。我认为你的问题与第三种情况有关。

第三种情况我们可能需要使用程序去除BOM或者根据我们的上下文进行处理。 这是一些我想您可能会感兴趣的解决方案: UTF-8 file reading: the first character issue

您可以使用此线程答案中给出的代码或使用 apache commons 来处理它: Byte order mark screws up file reading in Java