Java 如何从键盘上读取Unicode希腊文?

Java 如何从键盘上读取Unicode希腊文?,java,eclipse,unicode,character-encoding,Java,Eclipse,Unicode,Character Encoding,我想写一个希腊语词汇测试程序。问题是我无法让它正确解释输入字符。下面是我为演示该问题而编写的一些示例代码。(如果您不想为您的机器设置希腊文输入,当程序要求输入单词时,您可以复制并粘贴希腊文字符串。如果有意义,我将通过Eclipse在64位Win7上运行此操作。) 以下是输出: αβγδεζηθικλμνξοπρσςτυφχψω Type the word above: αβγδεζηθικλμνξοπρσςτυφχψω This is what the computer took from

我想写一个希腊语词汇测试程序。问题是我无法让它正确解释输入字符。下面是我为演示该问题而编写的一些示例代码。(如果您不想为您的机器设置希腊文输入,当程序要求输入单词时,您可以复制并粘贴希腊文字符串。如果有意义,我将通过Eclipse在64位Win7上运行此操作。)

以下是输出:

αβγδεζηθικλμνξοπρσςτυφχψω Type the word above: αβγδεζηθικλμνξοπρσςτυφχψω This is what the computer took from the keyboard: αβγδεζηθικλμνξοπÏ�σςτυφχψω Î ± Î ² Î ³ Î ´ Î µ Î ¶ Î · Î ¸ Î ¹ Î º Î » Î ¼ Î ½ Î ¾ Î ¿ Ï € Ï � Ï ƒ Ï ‚ Ï „ Ï … Ï † Ï ‡ Ï ˆ Ï ‰ 0x0ce 0x0b1 0x0ce 0x0b2 0x0ce 0x0b3 0x0ce 0x0b4 0x0ce 0x0b5 0x0ce 0x0b6 0x0ce 0x0b7 0x0ce 0x0b8 0x0ce 0x0b9 0x0ce 0x0ba 0x0ce 0x0bb 0x0ce 0x0bc 0x0ce 0x0bd 0x0ce 0x0be 0x0ce 0x0bf 0x0cf 0x20ac 0x0cf 0xfffd 0x0cf 0x192 0x0cf 0x201a 0x0cf 0x201e 0x0cf 0x2026 0x0cf 0x2020 0x0cf 0x2021 0x0cf 0x2c6 0x0cf 0x2030 This is what it should look like: αβγδεζηθικλμνξοπρσςτυφχψω α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ σ ς τ υ φ χ ψ ω 0x3b1 0x3b2 0x3b3 0x3b4 0x3b5 0x3b6 0x3b7 0x3b8 0x3b9 0x3ba 0x3bb 0x3bc 0x3bd 0x3be 0x3bf 0x3c0 0x3c1 0x3c3 0x3c2 0x3c4 0x3c5 0x3c6 0x3c7 0x3c8 0x3c9 αβγδεζηθικλμνξοπρσςτυφχψω 键入上面的单词:αβγΔεζηθικλμνξοπρσςτνφχψω 这是计算机从键盘获取的信息: αβγδεζηθικλμνξοπÏ�σςτυφχψω Î ± Î ² Î ³ Î ´ Î µ Î ¶ Î · Î ¸ Î ¹ Î º Î » Î ¼ Î ½ Î ¾ Î ¿ Ï € Ï � Ï ƒ Ï ‚ Ï „ Ï … Ï † Ï ‡ Ï ˆ Ï ‰ 0x0ce 0x0b1 0x0ce 0x0b2 0x0ce 0x0b3 0x0ce 0x0b4 0x0ce 0x0b5 0x0ce 0x0b6 0x0ce 0x0b7 0x0ce 0x0b8 0x0ce 0x0ce 0x0b9 0x0ce 0x0ba 0x0ce 0x0bc 0x0ce 0x0bd 0x0ce 0x0be 0x0bf 0x0cf 0x20ac 0x0cf 0xfffd 0x0cf 0x192 0x0cf 0x201a 0x0cf 0x201e 0x0cf 0x0cf 0x0cf 0x0cf 0x2026 0x0cf 0x2020 0x0cf 0x2021 0x0cf 0x0cf 0x0cf 0x0cf 0x2c6 0x0cf 0x2030 0x6 0x0cf 它应该是这样的: αβγδεζηθικλμνξοπρσςτυφχψω α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ σ ς τ υ φ χ ψ ω 0x3b1 0x3b2 0x3b3 0x3b4 0x3b5 0x3b6 0x3b7 0x3b8 0x3b9 0x3ba 0x3bb 0x3bc 0x3bd 0x3be 0x3bf 0x3c0 0x3c1 0x3c3 0x3c2 0x3c4 0x3c5 0x3c6 0x3c7 0x3c8 0x3c9
有人能告诉我如何解决这个问题吗?

您的代码假设通过
System.in进入的字节是使用UTF-8编码的。除非您已将平台的默认编码设置为UTF-8,否则这是不太可能的

如果指定与平台默认编码匹配的编码而不是UTF-8,会发生什么

例如,我的Linux机器的默认编码设置为UTF-8,当我运行你的程序时,我得到了“正确”的答案。但是,我不得不将
word
的定义更改为:

String word = "\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c3\u03c2\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9";
因为当我试图将希腊字母剪切粘贴到我的编辑器中时,我的编辑器不理解它们。将它们作为unicode转义序列输入,会得到完全相同的字符串,就好像我有一个能够理解输入的希腊字母的编辑器一样

因此,当我使用该更改运行您的程序时,我得到:

αβγδεζηθικλμνξοπρσςτυφχψω

Type the word above: αβγδεζηθικλμνξοπρσςτυφχψω

This is what the computer took from the keyboard:
αβγδεζηθικλμνξοπρσςτυφχψω
    α     β     γ     δ     ε     ζ     η     θ     ι     κ     λ     μ     ν     ξ     ο     π     ρ     σ     ς     τ     υ     φ     χ     ψ     ω 
0x3b1 0x3b2 0x3b3 0x3b4 0x3b5 0x3b6 0x3b7 0x3b8 0x3b9 0x3ba 0x3bb 0x3bc 0x3bd 0x3be 0x3bf 0x3c0 0x3c1 0x3c3 0x3c2 0x3c4 0x3c5 0x3c6 0x3c7 0x3c8 0x3c9 

This is what it should look like:
αβγδεζηθικλμνξοπρσςτυφχψω
    α     β     γ     δ     ε     ζ     η     θ     ι     κ     λ     μ     ν     ξ     ο     π     ρ     σ     ς     τ     υ     φ     χ     ψ     ω 
0x3b1 0x3b2 0x3b3 0x3b4 0x3b5 0x3b6 0x3b7 0x3b8 0x3b9 0x3ba 0x3bb 0x3bc 0x3bd 0x3be 0x3bf 0x3c0 0x3c1 0x3c3 0x3c2 0x3c4 0x3c5 0x3c6 0x3c7 0x3c8 0x3c9 
它对我有效的原因是我的计算机设置为使用UTF-8。因此,当我在终端中输入时,终端程序和/或操作系统将使用UTF-8将这些字符转换为字节,当Java使用UTF-8读取这些字节时,一切都很好

但是,如果我的计算机设置为ISO-8859-1,那么在终端上键入将生成在UTF-8中没有意义的字节,并且程序将从键盘读取“垃圾”。但是,如果该程序更改为使用ISO-8859-1,那么它可能会工作。(我说“可能”,因为我不知道ISO-8859-1是否能有效地将希腊字母编码为字节。)。因此,要使您的计划发挥作用,您需要做到两件事:

  • 读取器
    环绕
    系统时使用的编码。在
    中,必须使用与计算机在终端键入时将字节转换为字符相同的编码
  • 无论您的计算机使用何种编码,它都需要能够将希腊字母编码为在该编码中有效的字节序列

  • 查看Eclipse运行/调试配置的“公共”选项卡以了解编码。您可以输入正确的代码页或ISO代码。

    我报告它为,它只是这样:

    “我确认这是一个bug,将在下一版本(开普勒)中修复。”


    我感谢大家在这里的投入。

    +1解释了两端的重要性:提供程序-控制台和读取器-应用于System.in.的编码。感谢您的回复,QM。不幸的是,它不编码希腊语。因此,我需要找到一些方法来确定如何将我的Win7机器设置为UTF8。(我已经将Eclipse设置为UTF8,这听起来像是您需要对编辑器执行的操作。)我确实发现了这一点:我已经对Eclipse做了它建议的更改——没有帮助。唉,它说没有办法为整个操作系统设置编码。所以这让我回到了以前的状态。您还可以提供其他指导吗?除非您将系统默认(“ANSI”)代码页设置为希腊文(代码页1253),否则无法获得使用C标准I/O库(包括Java)读取希腊文的控制台程序。很抱歉Windows命令提示符只能与编译为使用Windows特定Unicode接口的程序进行Unicode对话,而MSVCRT应用程序不是。缺乏对UTF-8的支持是Windows下控制台应用程序长期以来的一个痛处。感谢您的回复,QuantumMechanical和bobince,它们很有启发性!Bobince,Win命令提示符的问题很有趣,但我想问一下Eclipse控制台。我看了看并设置了UTF-8,但没有乐趣。谢谢你的回复。我昨天发布评论之前没有看到它(“谢谢你的回复,QuantumMechanical和bobince…”),但我已经试过了。关于这是否是我应该报告的bug,有什么意见吗?我已经通过运行配置>公共>编码,以及通过窗口>首选项>常规>内容类型,将编码设置为UTF-8。
    αβγδεζηθικλμνξοπρσςτυφχψω
    
    Type the word above: αβγδεζηθικλμνξοπρσςτυφχψω
    
    This is what the computer took from the keyboard:
    αβγδεζηθικλμνξοπρσςτυφχψω
        α     β     γ     δ     ε     ζ     η     θ     ι     κ     λ     μ     ν     ξ     ο     π     ρ     σ     ς     τ     υ     φ     χ     ψ     ω 
    0x3b1 0x3b2 0x3b3 0x3b4 0x3b5 0x3b6 0x3b7 0x3b8 0x3b9 0x3ba 0x3bb 0x3bc 0x3bd 0x3be 0x3bf 0x3c0 0x3c1 0x3c3 0x3c2 0x3c4 0x3c5 0x3c6 0x3c7 0x3c8 0x3c9 
    
    This is what it should look like:
    αβγδεζηθικλμνξοπρσςτυφχψω
        α     β     γ     δ     ε     ζ     η     θ     ι     κ     λ     μ     ν     ξ     ο     π     ρ     σ     ς     τ     υ     φ     χ     ψ     ω 
    0x3b1 0x3b2 0x3b3 0x3b4 0x3b5 0x3b6 0x3b7 0x3b8 0x3b9 0x3ba 0x3bb 0x3bc 0x3bd 0x3be 0x3bf 0x3c0 0x3c1 0x3c3 0x3c2 0x3c4 0x3c5 0x3c6 0x3c7 0x3c8 0x3c9