1

如果我使用 BufferReader 读取一行,我可以得到一行的字符串。代码是这样的:

FileInputStream fs = new FileInputStream("E:\\tmp\\aaa.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fs));


String line = null;  
while ((line = br.readLine()) != null) { 
    System.out.println(line.length() + " " +line.substring(0, 2);
}

aaa.txt 的内容是:

一二三四1234

所以。运行代码的结果是:

8 一二

从结果中,我知道 String 中一个汉字的长度是一,而不是二。

所以如果我使用 line.substring(0,2),我会得到两个汉字“一二”。但我希望 line.substring(0,2) 的结果是“一”。

我的意思是,在我看来,“一二三四1234”的长度是 12,而不是 8。我可以使用 substring(0,2) 来提取固定长度的字符。

提前致谢。

4

4 回答 4

1

从结果中,我知道 String 中一个汉字的长度是一,而不是二。

没错,每个符号都是一个字符,所以这些“一二三四1234”字符串的长度是8

那为什么是12?

我的意思是,在我看来,“一二三四1234”的长度是 12,而不是 8。我可以使用 substring(0,2) 来提取固定长度的字符。

如果你知道你想要的字符的索引,你可以使用下面的代码:

String s = "一二三四1234";
char c = s.charAt(0);

因为 subString 方法从索引 0 到 2 创建了一个新的 String

于 2013-03-20T09:03:59.893 回答
0

如果我使用 line.substring(0,2),我会得到两个汉字“一二”。

所以你有两个字符。这就是你要求的。索引 0 和 1 处的两个字符。

但我希望 line.substring(0,2) 的结果是“一”。

如果您只想要一个字符,请要求一个字符。索引 0 处的字符line.substring(0,1)。例如。

于 2013-03-20T09:03:09.980 回答
0

Java 使用 unicode 作为内部字符集,因此任何 char 类型都是 unicode。而 java.lang.String 由字符组成。

当您从阅读器获取字符串时,文件的字节内容已经根据文件的编码转换为字符。

line.substring(0, 2) 产生一个新字符串,其中包含要返回的的第一个两个字符,这就是你已经得到的!

我猜“在我眼中的长度”是指你在 UltraEdit 这样的文本编辑器中看到的,也许编辑器只显示文件中字节的位置

于 2013-03-20T09:10:04.683 回答
0
  1. 首先,您需要使用中文编码对文件进行解码,例如 GBK、GB2312 等。

  2. 将该行读入字节数组,然后使用中文编码将该字节数组转换为字符串。

    FileInputStream fileStream=new FileInputStream(New  
    File("sometext.txt"));
    byte[] buf=new byte[12];
    byte[] line=reader.read(buf);
    byte[] byteRange=Arrays.copyOfRange(allBytes,0,2));
    String chineseString=new String(byteRange,Charset.forName("GBK")); 
    

这样你只会得到1个汉字。从 GBK 到 UTF-8 的转换只有 1 步。

哦耶!对前一种方法的改进。

于 2017-12-12T03:51:27.753 回答