如何摆脱UTF-8编码的.txt中的“Rogue Chars”

时间:2016-10-11 18:58:12

标签: java android encoding utf-8 chars

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

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”,这是字符串应该包含的另一个字符。问题;我如何摆脱那些看不见的“胭脂”字符?为什么他们首先出现在那里?

2 个答案:

答案 0 :(得分:0)

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

查看编辑器中是否有选项可以在没有BOM的情况下保存UTF-8。

显然,物料清单只是一个痛苦的问题:What's different between UTF-8 and UTF-8 without BOM?

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

或者你可以阅读&在用读卡器包装之前,丢弃输入流中的前三个字节。

答案 1 :(得分:0)

遗憾的是,您还没有提供示例文本文件,因此无法使用您的代码进行测试,这是基于猜测的理论答案,原因可能是: 看起来它是与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的编辑器或阅读器
  3. 第三是当我们使用正确的编码进行读写时,我们不会在文本编辑器中面临问题,而是面临其他应用程序或程序中的问题。我认为你的问题与第三种情况有关。
  4. 在第三种情况下,我们可能必须使用程序删除BOM或根据我们的上下文处理它。 这是一些解决方案,我想你可能会觉得有趣: UTF-8 file reading: the first character issue

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