BufferedReader对象的readLine()方法读到的中文字符长度算1(而不是2),
请教有什么办法能把它转换成2且不会乱码..谢谢.我的代码
FileReader fr=new FileReader(path);
BufferedReader br=new BufferedReader(fr);
String record=null
while((record=br.readLine())!=null){
  System.err.println(recode);

解决方案 »

  1.   

    在Java的字符处理中,所有的字符都是用Unicode保存的,也就是说,所有的字符,英文和中文的,都是占两个字节,但只算作一个字符。Java在把文本保存在磁盘中时,是根据系统的编码来进行转码的。也就是说,虽然Java虚拟机处理时,是以Unicode来处理的,但保存的时候,仍然会转换成系统的编码(中文Windows就是GBK编码了)这时,中文占两个字节,英文占一个字节。从你的代码里面,看不出有什么需要转换的地方。如果你只要判断它在磁盘中是占一个字节还是两个字节,可以使用 getChar() 然后,判断它是否大于128,小于128的自然就是ASCII码了。
      

  2.   

    谢谢你的回答...
    我生成文件的时候是按固定格式的,即系每项有固定长度,不足补空,(没有分隔符),
    我读文件的时候用substring()分隔,因为中文存的时候是按2个字节存的,但用
    BufferedReader对象的readLine()方法读到的中文字符长度算1(而不是2), 
    所以长度就乱了,请问有什么办法解决吗?String FileName="D:\\workSource\\zhjm\\zhwcn\\WebContent\\form\\data\\1256549941000.txt";
    BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(sFileName),"GBK"));

    String sLine=null;
    while((sLine=br.readLine())!=null){
    System.err.println("length="+sLine.length()+","+sLine.substring(0,16)+"-"+sLine.substring(16,18)+"-"+sLine.substring(18,41)+"-"+sLine.substring(41,53)+"-"+sLine.substring(53,54)+"-"+sLine.substring(54,64)+"-"+sLine.substring(64,82)+"-"+sLine.substring(82,91));
    }
      

  3.   

    这种方法就太简单了,你生成文件的时候,也按照每个字符不管中文英文都是一个字符,不就可以了。当然,如果在写文件的时候不是你管的,那也有一种方式,就是先读取这段文字,然后获取字节数组,就了解决了问题。即 byte[] stringByte = sLine.getBytes("GBK");
    这样,就按你刚开始的字节给分解了。
    如果你的长度是一样长的,那个stringByte数组的长度也应该都是一样长的。
    再重新生成字符串就行了。String str = new String(byte[] bytes,"GBK");
      

  4.   

    自己查API文档吧
    有一个构造方法,可以很适合你的情况:
    String(byte[] bytes, int offset, int length, Charset charset) 
      

  5.   


    转换成UTF-8就变成乱码...望请高人指教.
      

  6.   

    楼主生成文件补空格的长度是按照什么来计算的??建议按照字节长度来计算,一中文占2个长度,非中文1个长度取的时候直接取byte长度就ok了
      

  7.   

    一个中文字符的长度也是1,如果要获得字符编码的实际长度就用String.getByte().length,就是获得字节的长度。
      

  8.   


    我不是要取总长度...我是按substring方法来分隔取出来的每一行...
    因为存的时候中文是占两个字节(由别人生成的文件),我取的时候中文占一个字节
    所以就不能准确取值了..