本人因为Android才开始使用Java,上次因为字符串比较用==的问题已经让大家见笑了。感谢大家的帮助。这次又遇到不懂的地方了。还希望大家能够多多指教我这个迷路人。这里提前谢谢大家了。问题是这样的:我用C#创建了一个UTF-8文本文件sample.txt。假设里面写入了一个字符串
string s="字符串:abc";
而且已经通过工具确定这个文本文件没有BOM。然后我在Android中把这个文本文件放入raw目录中打开,用TextView显示。另外界面上还有几个Button。
相关代码:String ss="字符串:abc";protected java.io.InputStreamReader fs;
protected java.io.FileInputStream fis;
protected java.io.BufferedReader sr;
protected java.io.InputStream ips;try
{
    ips=this.getResources().openRawResource(R.raw.sample);
    fs=new java.io.InputStreamReader(ips,"UTF-8");
    sr=new java.io.BufferedReader(fs);
    String s=sr.readLine();
    this.mt.setText(s);
    if(s.equals(ss)==true)  this.b2.setText("相同");//b2是一个Button
    //或者直接比较仍然是不同???
   //if(s.equals("字符串:abc")==true) this.b2.setText("相同");
}
catch(Exception e){
    this.b1.setText("打开流的时候出错了!");//没有抛出任何异常。这行代码从来没有被激活。b1也是一个Button
}读取的时候正常,TextView也能够正确无乱码的显示"字符串:abc"。可是s和ss两个字符串却怎么也不相同?这到底是为什么呢?我把s和ss都用TextView来显示,至少从显示结果上看不出s和ss有不同。
我的错误出在哪呢?

解决方案 »

  1.   

    String s=sr.readLine().trim();
    读取文本的时候可能有空格,要把首位空格去掉
      

  2.   

    谢谢楼上两位的热心。你们的方法,我刚试了。还是不行。
    另外从我问题的描述就能够看出来。我是把我在PC上的软件移植到Android上,并且PC版本是使用了C#并工作正常。把数据文件拿到手机上打开出了问题。
    因为是通过程序建立的文件。所以应该不会有空格的问题。因为我在写入的时候就是writeline(string)的。也正是因为是自己的程序写进去的而不是通过记事本手动编辑的。所以才会没有BOM的问题。
      

  3.   

    回楼上两位:要是乱码就好了。最起码知道问题出在哪里。可问题是我在前面说的很清楚,读取和在TextView上显示都没有问题,TextView上也正确的显示了我文件里的字符串。弄得我都不知道到底问题出在哪?
    我也怀疑是编码的问题。因为我试验了一下用String类的getbyte方法比较两个字符串,结果还是不一样。
    代码:
    byte[] br=ss.getBytes("UTF-8");
    byte[] bs=s.getBytes("UTF-8");if(br==bs) this.b2.setText("相同");//这行还是不执行
      

  4.   

    trim一下,应该可以把首尾的空格,换行符都去掉
      

  5.   

    回复楼上:
    我刚试了一下,确实如您所说的,读出来的字符串比字符串原值长度多1。
    长度都不一样,两个串当然不一样了。可是多出来的到底是不是换行符我还不确定。
    而且这又引出另一个问题了。同样的代码C#版本没有任何问题。怎么到了Java这里就出了叉子了?
    当然,首先还是得弄明白这长度到底怎么差的1?
      

  6.   

    this.b3.setText(s.substring(s.length()-1));//b3是个button
    this.b4.setText(ss.substring(ss.length()-1));//b4是个button活见鬼了!这两行执行完的结果都是c
      

  7.   

    如果用windoes的记事本编辑过的文件,很可能产生不可见字符.因为记事本的回车,产生二个字符0x0A和0x08,再用Backspace删,只能删除0x0A;不清楚你是如何用C#创建UTF-8文本文件sample.txt.你试试是否是这个原因.
      

  8.   

    因为同一个人不能连续回帖三次。结果我只能等着有人回复之后才能继续说试验的结果。
    多出来的不可见字符在字符串的开头。得到它的UTF-8编码是 -1 ???
    而再读取第二行的时候,即再次readline(),开头就没有这个编码为 -1 的不可见字符了。
    现在我怀疑我是不是被我用的工具软件给骗了!
    这个 -1 会不会是文件头?
    有熟悉BOM的吗?
    这个 -1 是不是BOM?
      

  9.   

    你用字符 方式读取,不要用utf-8
      

  10.   

    用notepad++这种文本编辑软件打开文件,显示换行符,看看是LF CR双符号换行的还是单单CR换行。
      

  11.   

    在utf-8编码文件中BOM在文件头部,占用三个字节,用来标示该文件属于utf-8编码, UTF-8的BOM是 EFBBBF
    单个-1不太象BOM.