我运行了以下程序。
Text t = new Text("\u0041\u00DF\u6771\uD801\uDC00");
System.out.println(t.getLength());
System.out.println(t.find("\u0041"));
System.out.println(t.find("\u00DF"));
System.out.println(t.find("\u6771"));
System.out.println(t.find("\uD801"));
System.out.println(t.find("\uD801\uDC00"));
Output
10
0
1
3
-1
6
从我的理解中,find返回Text中的byteoffset。
0041 - > 01000001,00DF - > 11011111,6771 - > 0110011101110001
我无法理解输出。 也是为什么
t.find( “\ uD801”)
是-1?
答案 0 :(得分:1)
此示例已在 HADOOP The Definitive Guide 一书中进行了解释。
Text
类使用UTF8
编码存储数据。由于它使用UTF8
编码,因此Text
内的索引基于UTF8编码字符的字节偏移量(与Java字符串不同,其中字节偏移量在每个字符处)。
您可以看到这个答案,以了解Hadoop中Text和String之间的区别: Difference between Text and String in Hadoop
文字:“\ u0041 \ u00DF \ u6701 \ uD801 \ uDC00”,解释如下:
41
(1字节) c3 9f
(2字节) e6 9d b1
(3字节) f0 90 90 80
(4字节) 以下是字节偏移量,当它存储在Text
(UTF-8编码)时:
41
)c3 9f
)e6 9d b1
)最后,最后一个UTF-8字符(DESERET CAPITAL LETTER LONG I)占用4个字节(f0 90 90 80
)。
因此总长度为:1 + 2 + 3 + 4 = 10.
当你t.find("\uD801")
时,你得到-1。因为,根据UTF-8编码,字符串中不存在此类字符。
“\ uD801 \ uDC00”被视为单个字符(DESERET CAPITAL LETTER LONG I)。因此,当您查询“\ uD801 \ uDC00”的偏移量时,您会得到6的正确答案。