在Java中使用UTF-8编码的中文字符进行模式匹配

5

我需要检查一个中文省份是否包含在一个中文地址里。

我能够轻松读写汉字。

我尝试使用String的indexOf()方法来检查省份(例如广东)是否包含在地址(中国 广东)中。然而,这总是返回-1。

当我尝试检查数字(例如103是否包含在9910399中)时,它运行正常。

我需要做一些不同的事情来处理UTF-8字符串匹配吗?谢谢。 Matt


3
Java中的String内部始终为UTF-16编码,因此无论您遇到什么问题都与UTF-8无关。您确定要查找的字符串中的字符完全相同吗?可以使用System.out.println((int)s.charAt(i))在两侧进行检查。 - hmakholm left over Monica
2
你的例子对我有效,你检查一下你的 .java 文件保存的编码是否正确了吗? - James Goodwin
1个回答

2
我刚刚尝试了你的示例,虽然我在系统上没有中文字体,所以字符显示不正确,但indexOf()对我来说很好用。
因此,请检查您源文件(*.java)的编码。例如,如果您使用的是eclipse,请在Window / Preferences / General / Workspace / Text file Encoding下进行检查。我正在使用UTF-8。
第二个问题是Java编译器使用的编码。在eclipse的情况下,您不必说任何话。我认为对于javac,您应该使用-encoding明确设置编码。否则,可能会使用默认的操作系统编码。
祝你好运。

嗨,Alex,非常感谢!我意识到我没有说得够具体。你是完全正确的 - 如果我直接使用字符串,上面的例子就可以正常工作。问题出现在我从文件中读取这些字符串时。我打印出了实际的字符,发现ASCII 34在Unicode字符之前显示出来了。 - Matt Smith
看起来我不是遇到了中文特定的问题 - 而是一个文件读取问题。我有两个文件 - 省份和地址。我在省份中有字符A,在地址中有AB。当我使用readline()读取它们并打印出来时,我看到以下内容被打印出来:(1) 对于只有A的省份 - 34:65:34 (2) 对于只有AB的地址 - 34:65:66:34 不确定我应该怎么做才能确保省份与地址匹配,或者A与AB匹配。 - Matt Smith
@Matt - AlexR是正确的;查看相关的I/O方法,这些方法需要编码(字符串ID或Charset)输入。您必须始终根据需要解码文本数据输入(包括Java源文件)。请参见此处获取基本入门指南。请参见此处获取一个原始应用程序,可以帮助诊断问题。 - McDowell

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