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

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控制台):

?ü?ç?Ü?Ç?
ğüşçĞÜŞÇı
?ü?ç?Ü?Ç?

我不明白的问题。

有帮助吗?

解决方案

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");

是否准确无关。

要写入字符串与不同的编码默认编码到标准输出,你需要创建一个编码器类似new OutputStreamWriter(System.out, "cp1252")和字符串的内容发送到

然而,在这种情况下,它看起来像控制台使用Windows代码页1252西欧(+1 ATorres)。有没有编码不匹配的问题在这里,因此你将无法通过重新编码字符串来解决吧!

默认编码CP1252匹配控制台的编码,它只是CP1252不包含土耳其字符ğşĞŞı可言。你可以看到的的在CP1252,üçÜÇ其他字符,来通过就好了。除非你能重新配置为使用不同的编码,它包括所有你想要的字符控制台,没有办法,你将能够输出这些字符。

想必对土耳其的Windows安装后,默认代码页将被替代cp1254,你会得到你所期望(但是其他字符不工作)的字符。可以通过改变“语言用于非Unicode应用程序”中的区域和语言选项控制面板应用设置对此进行测试。

不幸的是没有Windows区域使用UTF-8作为默认代码页。把非ASCII输出到与stdio流功能控制台是不是一件真正可靠的。有一个Win32 API编写的Unicode直接到控制台,但遗憾的是没有什么用了。

其他提示

不要依靠在控制台上,或在默认的平台编码。始终指定像getBytes和String构造以字节数组调用的字符编码,如果你想检查一个字符串的内容,打印出每个字符的Unicode值。

我也建议或者限制源代码使用ASCII(和为\ uXXXX来编码非ASCII字符)的显式指定的字符编码时编译。

现在,有什么更大的问题是你想解决?

您可以处理的默认编码的不同的设置。

java -Dfile.encoding=utf-8

java -Dfile.encoding=something else

或者,你可能只是看到了苹果终端窗口用UTF-8和Windows DOS窗口确实事实的的是UTF-8的工作。

按飞碟双向先生,您有第三个可能出现的问题,这是你正在试图嵌入UTF-8字符在源。根据不同的编译器选项,你可能会或可能不会得到你打算那里。将这个数据在属性文件中,或使用\Ú逸出。

最后,还每碟先生,永远不会调用零参数的getBytes()。

如果您使用的AspectJ编译器不要忘记设置它的编码设置为UTF-8。我已经在努力寻找这几个小时。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top