如何在Java中使用Scanner正确读取中文字符?

4

编程语言:Java 任务:设计一个哈希函数,将中文字符串映射为数字 问题:正确读取和显示中文字符

这是一个作业问题,但我不是在问如何解决它,而是在实现中文字符的读取时遇到了困难。

我的任务简要描述如下:设计一个哈希函数,将(中国)学生姓名映射到他们的学生ID、性别、电话等其他卫星数据。

虽然我仍在思考,但就像其他语言一样,我需要使用字符编码来通过哈希函数得出一个唯一的值。如果我没有弄错的话。

以下是我用来测试这个想法有效性的内容:

// test whether console can read chinese characters
Scanner s = new Scanner(System.in);

System.out.print("Please enter a Chinese character: ");
int chi = (int)s.next().toCharArray()[0];

System.out.println("\nThe string entered is " + chi);

如果我使用简单的System.out.println("character")语句,则会显示正确的字符。

但如上所述,如果我使用Scanner来读取输入,我尝试将String转换为char数组,然后转换为其int unicode等效项,但它会产生一个荒谬的数字,并且我无法正确地显示它。

我意识到我可以使用这个错误的值来设计哈希函数,但是为了不产生可能的冲突(我不知道这些是否会产生唯一的错误值),并且为了学习的缘故,您能指出如何统一处理不同机器上的中文字符输入吗?

非常感谢您的想法。 :D

Baggio.


1
这是一个作业问题,但我不是在问如何做它,我预测你会走得很远,并在旅途中获得许多盟友。 :) - Andrew Thompson
为什么你不能直接使用名称的 String 的哈希码?为什么要把 char 强制转换成 int 来搞这些事情? - artbristol
@artbristol 我还没有想过那个...会试一下 - 谢谢! - blazonix
3个回答

3

当你创建一个Scanner时,你可以告诉它使用哪种字符编码。 这里是文档。


谢谢 - 我之前不知道这个 - 我会去查一下。 - blazonix
当我尝试阅读日语字符时,这对我不起作用。 - Abi
@Abi:有几种不兼容的字符编码常用于日语字符,例如Unicode、Shift-JIS、EUC-JP或ISO-2022-JP。确保您选择正确的编码以匹配您的字符。 - Philipp

3
当您使用非基本ASCII字符时,需要考虑使用的字符集。最常见的是UTF-8,但也可以使用其他字符集。
需要记住的一件事是,非ASCII字符的大小可能超过1个字节。中文字就属于这种情况。
处理多字节字符时,您需要以代码点为单位思考(即表示UTF-8字符的整数),而不是单个字节字符。
较新版本的Java允许您使用代码点迭代字符串。请查看Java API for String。

将字符串转换为字符数组是可行的,但将其转换为字节数组则不行。 - artbristol
确实,如果我对你所说的理解正确的话,那很奇怪——每个我使用Scanner读取的中文字符,打印出来的int等价物都是三个int的序列——可能就是你提到的码点。我会记住这一点的,谢谢! - blazonix

1
你想得太多了。每个 String 已经(在概念上)是一个包含中文字符的字符序列。编码只有在需要将其转换为字节时才会涉及,而对于你的任务来说,你不需要这样做。只需使用 String 的哈希码即可。实际上,当你创建一个 HashMap<String,YourObject> 时,背后发生的就是这种情况。

我还没有详细了解过Map类及其使用方法,但这是一个有用的指针,我稍后会查看它。是的,我可能把它搞得太复杂了,感谢你指出来! - blazonix

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