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 作为默认代码页。使用 stdio 流函数将非 ASCII 输出放到控制台上根本不是真正可靠的东西。有一个 Win32 API 可以将 Unicode 直接写入控制台,但遗憾的是没有太多使用它。