在Windows和Linux中转换字符集

时间:2013-06-24 08:45:51

标签: java linux character-encoding utf-16 smpp

我正在构建SMPP网关,它获取印度字符的byte []数组并将其转换为通过电子邮件转发的可读字符串。 在Win机器中,此代码正在运行:

byte[] data= ....;
shortMessage = new String(data, GSMCharset.forName("UTF-16"));
然而,在Linux中,它给垃圾带来了麻烦。

我尝试了其他字符集选项,但都没有给我任何东西。 任何想法如何使它在Linux上运行。

(DataCoding == 8)

1 个答案:

答案 0 :(得分:1)

输出的编码似乎是由源文件的编码控制的。除非在编译时指定(How can I specify the encoding of Java source files?),否则默认编码将从OS继承。

我猜你使用的Windows机器有一个默认编码,导致你期望的输出,而Linux机器没有。有关报告的类似问题,请参阅此问题 - Charset of Java source file and failing test

我能够重现这种行为。还找到了一个修复 - 更改源文件的编码。请继续阅读。

我用两种不同的编码运行了以下代码。

System.out.println(Charset.defaultCharset().toString());
byte[] data = new byte[] {9, 22, 9, 65, 9, 54, 9, 22, 9, 44, 9, 48, 9, 64};
System.out.println(Arrays.toString(data));
System.out.println(new String(data, "UTF-16"));

使用OS的默认编码

在我的情况下,我的Mac上是“MacRoman”。输出是这样的:

MacRoman
[9, 22, 9, 65, 9, 54, 9, 22, 9, 44, 9, 48, 9, 64]
???????

使用UTF-8编码

我更改了源文件的编码(请参阅源文件的“属性”)。再次跑。输出是这样的:

UTF-8
[9, 22, 9, 65, 9, 54, 9, 22, 9, 44, 9, 48, 9, 64]
खुशखबरी