Java 特殊的非ASCII字符显示为?打印ArrayList时

Java 特殊的非ASCII字符显示为?打印ArrayList时,java,string,arraylist,utf-8,character-encoding,Java,String,Arraylist,Utf 8,Character Encoding,我已经搜索了很多年,没有发现任何人有和我一样的问题。当我在Eclipse中运行程序时,一切看起来都很好。一旦我在windows CMD中运行它,我的ArrayList中所有特殊的非ASCII字符都将替换为?。Dog类中有两个属性是字符串,即“name”和“race” 以下是在我的主程序中打印列表的代码: System.out.println("\r\nLista på hundar i hundregistret: " + viewDogList.toString() + "\r\n"); 以

我已经搜索了很多年,没有发现任何人有和我一样的问题。当我在Eclipse中运行程序时,一切看起来都很好。一旦我在windows CMD中运行它,我的ArrayList中所有特殊的非ASCII字符都将替换为?。Dog类中有两个属性是字符串,即“name”和“race”

以下是在我的主程序中打印列表的代码:

System.out.println("\r\nLista på hundar i hundregistret: " + viewDogList.toString() + "\r\n");
以下是my Dog类、属性和使用的方法的信息:

private String name; //attribute for the dog's name
private String race; //attribute for the dog's race

public Dog(String name, String race, int age, double weight)

        public String getName() { //hämta hundnamn      
        return name;
        }

        public void setName (String name) { //sätta hundnamn
            this.name = name;
        }

        public String getRace() {
            return race;            
        }

        public void setRace (String race) { //sätta hundras
            this.race = race;
        }
这是如何构造狗列表和添加狗对象的:

ArrayList<Dog> viewDogList= new ArrayList<Dog>();
Dog dogInstance = new Dog("", "", 0, 0.0);
viewDogList.add(dogInstance);
感谢您的帮助!
TIA

编辑:我已经撤销了我的答案,以便它的信息现在是正确的

包含特殊字符(如å、ä、ö)的普通字符串之所以有效,是因为这些字符的编码方式是cmd可以读取的

当您使用扫描仪时,字符串的编码方式是cmd无法读取的,因此,您必须确保所有扫描仪输入编码正确,以便cmd能够读取

可以通过修改扫描仪设置输入的字符编码:

new Scanner(System.in, "UTF-8")
编辑:Windows中的另一个问题导致cmd不接受chcp更改。

编辑:将cmd设置为chcp 65001/UTF-8无效

结论:cmd不支持UTF-8 byt默认值,但将cmd设置为UTF-8(chcp 65001)不适用于java。如果仍然输入非ascii字符,则输出仍然不正确,程序将崩溃

编辑:

绝对没有办法让cmd与UTF-8一起工作。我必须使用扫描仪来:

new Scanner(System.in, "cp850")
当然,这使得Eclipse没有正确显示å、ä、ö字符,因此我必须手动将Eclipse控制台设置为显示chcp 850,就像默认情况下windows cmd一样


这一切都是微软的错。cmd绝对没有逻辑不支持UTF-8,也从来没有。太愚蠢了。我打赌这与贪婪的M$wanting$$有关

这是windows控制台设置不正确的问题;对其进行配置,使其使用能够显示此类字符的字体。或者跳入21世纪,使用cygwin终端:其他可能相关帖子的可能副本:并检查这些3和。。基本上,您需要确保您的命令提示符理解(编码和解码)这些字符,为此,请使用支持高级BMP平面中Unicode字符的Lucida console字体,并执行此命令提示符
chcp 65001
new Scanner(System.in, "cp850")