使用Unicode显示欧元符号并将字符转换为大写

4
我需要用Java完成以下任务: 部分1:使用字符原始数据类型输出€188。使用欧元符号€的Unicode。 部分2:将以下char变量'j''o''e'更改为大写JOE,并输出结果。
我已经使用了以下代码,还有什么遗漏吗?

我要用Java来完成这个任务

public class Test27 {

    public static void main (String args[]){
    System.out.println("\u20ac" +"188");

    String changeCase= "joe";

    String result;
    result=changeCase.toUpperCase();

    System.out.println( result);        
    }
}

干杯


2
当你编译/运行它时会发生什么?最近我没有经常使用Java,但它看起来很合理...问题出在哪里? - James Green
除了样式之外,没有什么不同。空格是一个好主意,但可以更有系统地放置。changeCase不像mixedCaselittleJoe那样清晰地识别为名词。Char变量听起来不像String。 - Joop Eggen
作业要求使用原始的 char 数据类型,而不是 String。因此,正确的写法应该是 '\u20AC' + "188"System.out.print(Character.toUpperCase('j')) 等等。 - erickson
2
这对于初学者来说是一个非常糟糕的作业 - 将非 ASCII 文本输出到终端是困难且不可靠的,这与 Java 代码编写无关而与损坏的平台有关,正如 @andrewdotn 的回答所述。 - bobince
谢谢Erickson,我想那就是我遇到的问题。 - Dan Wyer
2个回答

8

如果问题只是关于欧元符号出现乱码的话——也就是程序

import java.io.*;

public class Foo {

    public static void main (String args[])
        throws Exception
    {
        System.out.println("\u20ac");
    }
}

首先,您需要阅读《软件开发人员绝对必须了解的Unicode和字符集最低限度(没有借口!)》

然后,您需要让Java发送的编码匹配显示Java输出的编码。我假设您正在使用命令行。

  • 在Linux上,这应该很简单。默认情况下,所有内容都是UTF-8。

  • 在Mac上,Terminal.app中无法正常工作,因为由于某些荒谬的原因,Java的默认文本编码是古老的MacRoman字符集 [更新:我认为从Java 7开始,默认值已经得到修复,不再是问题],它没有欧元符号。但是,Terminal.app完全支持UTF-8。技术上,您可以在Terminal → 首选项 → 设置 → 高级 → 国际 中关闭它,但默认情况下是UTF-8。

要设置java使用UTF-8输出,可以通过传递命令行参数来实现。

    java -Dfile.encoding=UTF-8 Foo

但这仅适用于您可以控制程序启动的情况。如果您要发送给其他人运行的JAR或.class文件,则无法使用此方法。您可以通过创建一个将使用不同编码写入System.out的对象来设置编码:

    import java.io.*;
    
    public class Foo {
    
        public static void main (String args[])
            throws Exception
        {
            PrintWriter out = new PrintWriter(
                new OutputStreamWriter(System.out, "UTF-8"), true);
    
            out.println("\u20ac");
        }
    }

只要您记得始终使用新的out变量进行打印,而不是使用System.out,就可以了。
在Windows上,情况变得更加混乱。命令提示符的默认编码因Windows的不同语言版本而异。在英文版Windows上,默认编码为Cp850。在俄罗斯版Windows上,默认编码为Cp866。两种编码均不支持欧元符号!您可以使用chcp命令更改编码,但即使您将其更改为支持欧元符号的编码,命令提示符的默认字体也不支持欧元符号!
您可能能够从Java中检测到您正在Windows命令提示符下运行,通过编程方式更改编码和字体,然后输出您的字符串,但这需要大量的工作。您最好使用以上代码来强制输出UTF-8,并在您的代码中包含说明,如果要在Windows命令提示符下运行该代码,则用户需要先执行以下操作:
1. Run `chcp 65001` to switch the command prompt encoding to UTF-8
2. Switch the font to Lucida Console by clicking the icon in the upper left corner, selecting Properties, and going to the Font tab.

为了让事情变得更容易,但为了增加您编写的代码只能在您的计算机上运行的可能性,您还可以将默认命令提示符代码页更改为UTF-8

enter image description here enter image description here


1
请注意,当代码页设置为65001时,MS C运行时存在严重的错误,可能会导致Java和其他应用程序挂起或表现不一致。因此,总体上来说,使用65001进行所有工作并不是一个好主意。不幸的是,在Windows下,UTF-8是二等公民。 - bobince
非常感谢大家,输出没有问题,只是在Char和String方面有些混淆,它可以正常输出€188,我只是不确定代码是否符合规格,谢谢! - Dan Wyer
1
作为代码页65001的替代方案,858(又名IBM00858:OEM多语言拉丁1 +欧元符号)也具有€符号。 - user1708042
真的是一个很棒的答案!如果我有两个赞,我一定会给你两个!!非常有教育意义,真正地解决了这个问题。 - the_new_mr
1
@the_new_mr 谢谢!我注意到有一条关于macOS的评论不再准确,所以进行了小修正。 - andrewdotn

2
如果输出的是乱码而不是欧元符号,那么可能是您运行程序的控制台存在问题。请确保它能够打印 € 符号,并且平台的默认字符编码与控制台的字符编码匹配。

这个答案更加成熟。现在我们知道谁是专家,谁不是。 - Al Kasih

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