正确的UTF-8字符串分割方法

3

我希望能够分割一个utf-8字符串。

我尝试了StringTokenizer,但它失败了。

标题应该是“0”,但显示为“عُدي_صدّام_حُسين”。

    String test = "en.m عُدي_صدّام_حُسين 1 0";

    StringTokenizer stringTokenizer = new StringTokenizer(test);
    String code = stringTokenizer.nextToken();
    String title = stringTokenizer.nextToken();

enter image description here 如何正确地拆分UTF-8字符串?


默认情况下,StringTokenizer 会以空格分割字符串(精确地说是 " \t\n\r\f")。你为什么期望第二个标记是最后一部分而不是第一个空格之后的部分呢? - Jiri Tousek
@JiriTousek 我认为这正是 OP 的问题,他期望标题是 0,但实际上得到了那个阿拉伯语部分。此外,我尝试在该字符串上使用 .split(" "),结果也是一样的(代码中是 en.m,而标题则是阿拉伯字符串)。 - Rafalon
@Rafalon 是的,那就是我遇到的问题。 - Jason
@AndyTurner,我想不到这个,这既有趣又好笑!我认为你应该把它发表为答案! - Rafalon
2个回答

4
问题在于阿拉伯文本并不是字符串的“结尾”。
例如,如果我在Chrome中选择字符串文字的内容(从左到右移动鼠标),它会首先选择en.m,然后选择所有阿拉伯文本,最后是0 1。该文本看起来只是“在结尾”,因为它是这样呈现的。
如您在Java源代码中指定的字符串实际上将عُدي_صدّام_حُسين作为第二个令牌。因此,您正确地拆分了它,只是您没有拆分您认为正在拆分的内容。

我想补充一点,直接在字符串上使用.split(" ")会按照相同的顺序生成一个数组。 - Rafalon
2
关键词是双向文本 - user8097737

0

通常情况下,没有唯一正确的方法,但我通常使用String类的substring()方法(请参见这里)。您可以传递起始索引,使其返回从该索引到原始字符串结尾的子字符串,或者传递原始字符串中子字符串的两个边界。如果您不知道字符的索引,则可以使用同一类的indexOf()方法在原始字符串中定位一个字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接