Java 标记化的StringTokenizer问题

Java 标记化的StringTokenizer问题,java,stringtokenizer,Java,Stringtokenizer,给定上述代码,输出如下: String a ="the STRING TOKENIZER CLASS ALLOWS an APPLICATION to BREAK a STRING into TOKENS.  "; StringTokenizer st = new StringTokenizer(a); while (st.hasMoreTokens()){ System.out.println(st.nextToken()); 我唯一的问题是为什么“字符串标记器类”被合并成一个标记 当

给定上述代码,输出如下:

String a ="the STRING TOKENIZER CLASS ALLOWS an APPLICATION to BREAK a STRING into TOKENS.  ";

StringTokenizer st = new StringTokenizer(a);
while (st.hasMoreTokens()){
  System.out.println(st.nextToken());
我唯一的问题是为什么“字符串标记器类”被合并成一个标记

当我尝试运行此代码时

the
STRING TOKENIZER CLASS
ALLOWS
an
APPLICATION
to
BREAK
a
STRING
into
TOKENS. 
它打印了一个有趣的结果

假的

这听起来不合逻辑,对吗?我不知道出了什么问题

我找到了原因,Java不知何故没有将该空间识别为有效空间。但是,我不知道从前端处理到我发布的代码,结果是怎样的

伙计们,我需要强调一下,下面的代码在上面的代码之前先运行

如果(!suspectedContentCollector.isEmpty()){ 迭代器i=suspectedContentCollector.Iterator(); 字符串temp=“”; 而(i.hasNext()){ temp+=i.next().toLowerCase()+“”; } StringTokenizer st=新的StringTokenizer(临时)

因此,一旦改为大写,似乎哪里出了问题,我意识到只有某些空格无法识别。这可能是从文档中检索文本的原因吗

以下代码

String a=“字符串标记器类允许应用程序将字符串拆分为标记。”; for(inti:a.toCharArray()){ 系统输出打印(i+“”); }

产出如下:

116 104 101 32 83 84 82 73 78 71 160 84 79 75 69 78 73 90 69 82 160 67 76 65 83 83 32 65 76 76 79 87 83 32 97 110 32 65 80 80 76 73 67 65 84 73 79 78 32 116 111 32 66 82 69 65 75 32 97 32 83 84 82 73 78 71 32 105 110 116 111 32 84 79 75 69 78 83 46 160
32

是否可能在“字符串标记器类”中使用的不是普通ascii空格?也许你按下了shift键,在那里得到了一个移位的空格?

那里--答案在你添加的代码段中。列出的整数显示字符串后面的空格是ASCII字符160,这是
,而不是字符32,这是普通的空格。编辑原始字符串,替换sp字符串标记器类中具有实际空格而不是移位空格的ACE

只是1.4.2 Javadoc中的旁注:

StringTokenizer
是一个遗留类 出于兼容性原因保留 尽管在纽约不鼓励使用它 代码。建议任何人 使用
字符串的拆分方法
java.util.regex
package


如果从网页或Word文档中复制/粘贴句子,很可能会得到一些特殊字符,而不是空格(例如:不间断空格等)。
请在Java编辑器中键入该句子,再试一次。

帮个忙,复制并粘贴此代码段的输出:

        while (st.hasMoreTokens()){
            temp=st.nextToken();
            temp=StopWordsRemover.remove(temp);
            analyzedSentence = analyzedSentence.replace(temp,temp.toUpperCase());
        }
    }

好的,现在看一下输出,它证实了我们所有人的猜测:这些“空格”是ASCII 160,即
不间断空格。它与ASCII 32常规空格不同

您可以让标记器(正如其他人所说,它已经过时)包含ASCII 160作为分隔符,或者,如果它本来不应该存在,您也可以从输入字符串中将其过滤掉


现在,在标记化之前,
a=a.replace((char)160,(char)32);
是一个快速修复方法。

查看字符代码,所讨论的“空格”是0xA0,它是一个非中断空格。我猜是有意输入的,以便将“字符串标记器类”视为一个单词

解决方案(如果您确实认为将“STRING TOKENIZER CLASS”拆分为三个单词是正确的)是将不间断的空格作为分隔符添加到StringTokenizer类(分别是STRING.split()方法)


我打赌原始字符串包含移位空格而不是空格(或其他一些空格).我看不出有什么问题…我觉得它运行得很好!你在使用哪个java版本?在哪个平台上?@Enrique:JDK1.6 18可能是我有两个jdk吗?JDK1.6 17和JDK1.6 18我的想法和你一样..但是,原来的字符串都是小写的..我将一些单词改为大写..在更改了那部分之后,一些空格似乎是空的未被发现,这对我来说是一个非常奇怪的情况。你知道为什么吗?你是通过点击“大写锁定”或按住“shift”键将它们改为大写的吗如果是后者,Paul的观点似乎是正确的。是的……如果我键入它,它没有问题,但是,如果只是通过一些处理,它有这个问题……对不起,如何实际替换为ASCII 160到ASCII 32的规则空格?因为你粘贴的代码,a=a.replace(160,32);不起作用。对不起,我忘了添加演员阵容
(char)
        while (st.hasMoreTokens()){
            temp=st.nextToken();
            temp=StopWordsRemover.remove(temp);
            analyzedSentence = analyzedSentence.replace(temp,temp.toUpperCase());
        }
    }
    for (int i : a.toCharArray()) {
        System.out.print(i + " ");
    }
  new StringTokenizer(string, " \t\n\r\f\240")