Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:Mac/Windows的土耳其编码_Java_Encoding_Turkish - Fatal编程技术网

Java:Mac/Windows的土耳其编码

Java:Mac/Windows的土耳其编码,java,encoding,turkish,Java,Encoding,Turkish,我对不同机器上的土耳其特殊字符有问题。以下代码: String turkish = "ğüşçĞÜŞÇı"; String test1 = new String(turkish.getBytes()); String test2 = new String(turkish.getBytes("UTF-8")); String test3 = new String(turkish.getBytes("UTF-8"), "UTF-8"); System.out.println(test1); Sy

我对不同机器上的土耳其特殊字符有问题。以下代码:

String turkish = "ğüşçĞÜŞÇı";

String test1 = new String(turkish.getBytes());
String test2 = new String(turkish.getBytes("UTF-8"));
String test3 = new String(turkish.getBytes("UTF-8"), "UTF-8");

System.out.println(test1);
System.out.println(test2);
System.out.println(test3);
在Mac上,这三个字符串与原始字符串相同。在Windows机器上,这三行是(使用Netbeans 6.7控制台打印):


我不明白这个问题

不要依赖控制台或默认平台编码。始终为调用指定字符编码,如
getBytes
和字符串构造函数(采用字节数组),如果要检查字符串的内容,请打印每个字符的unicode值

我还建议将源代码限制为使用ASCII(并\uxxx编码非ASCII字符),或者在编译时显式指定字符编码


现在,您想解决什么更大的问题?

您可能正在处理不同的默认编码设置

java -Dfile.encoding=utf-8

java -Dfile.encoding=something else
或者,您可能只是看到Mac终端窗口在UTF-8中工作,而Windows DOS框在UTF-8中不工作

根据Skeet先生的说法,您还有第三个可能的问题,那就是您试图在源代码中嵌入UTF-8字符。根据编译器选项的不同,您可能会也可能不会得到您想要的结果。将此数据放入属性文件,或使用\u转义


最后,也是按照Skeet先生的说法,永远不要调用零参数getBytes()。

如果您使用的是AspectJ编译器,请不要忘记将其编码也设置为UTF-8。我花了好几个小时才找到这个

String test1 = new String(turkish.getBytes());
您使用包含土耳其字符的Unicode字符串,并使用默认编码将其转换为字节(使用默认编码通常是错误的)。然后将这些字节解码回字符串,再次使用默认编码。结果是您什么也没有得到(除了丢失任何不适合默认编码的字符);无论您是否将字符串放入编码/解码循环,都不会影响以下
System.out.println(test1)
的功能,因为它仍然在打印字符串而不是字节

String test2 = new String(turkish.getBytes("UTF-8"));
编码为UTF-8,然后使用默认编码进行解码。在Mac上,默认编码是UTF-8,因此这不起任何作用。在Windows上,默认编码永远不是UTF-8,因此结果是错误的字符

String test3 = new String(turkish.getBytes("UTF-8"), "UTF-8");
他什么也不做

要使用与默认编码不同的编码将字符串写入标准输出,您需要创建一个类似于
newoutputstreamwriter(System.out,“cp1252”)
的编码器,并将字符串内容发送到该编码器

但是,在本例中,控制台似乎使用的是Windows代码页1252西欧(+1 ATorres)。这里根本没有编码不匹配的问题,所以您无法通过重新编码字符串来解决它

默认编码cp1252与控制台的编码匹配,只是cp1252根本不包含土耳其语字符
。您可以看到cp1252中的其他字符,
üÜÜÜÜ
,通过得很好。除非您可以重新配置控制台以使用包含所有所需字符的不同编码,否则无法输出这些字符

String test3 = new String(turkish.getBytes("UTF-8"), "UTF-8");
可能在土耳其Windows安装中,默认代码页将改为cp1254,您将获得预期的字符(但其他字符不起作用)。您可以通过更改“区域和语言选项”控制面板应用程序中的“用于非Unicode应用程序的语言”设置来测试这一点


不幸的是,没有Windows区域设置使用UTF-8作为默认代码页。使用stdio流函数将非ASCII输出放到控制台上并不是一件真正可靠的事情。有一个Win32 API可以直接将Unicode写入控制台,但不幸的是,没有多少使用它。

我会检查Netbeans控制台编码(听起来可能是ISO-8859-X或Windows1252或…)我对Windows 7@ATorras也有同样的问题:精彩的评论!把它作为我问题的答案,我会接受的it@Roman,我的答案是:那是file.encoding.+1。遗憾的是,这么多Java stdlib都有编码的默认参数;依赖默认编码几乎没有什么好的理由,它只会导致可怕的bug和部署问题。谢谢!我也遇到了类似的问题,更改Windows的区域设置解决了这个问题。或者更确切地说,根据你的回答,我意识到确实没有问题,罪魁祸首是安慰。再次感谢您,您的回答对于国际化这个混乱的话题至关重要。