我正在构建 SMPP 网关,它获取印度字符的 byte[] 数组并将其转换为通过电子邮件转发的可读字符串。在 Win 机器中,此代码正在运行:
byte[] data= ....;
shortMessage = new String(data, GSMCharset.forName("UTF-16"));
然而,在 Linux 中,它是垃圾。
我尝试了其他字符集选项,但都没有给我任何东西。任何想法如何使它在 Linux 上工作。
(数据编码 == 8)
我正在构建 SMPP 网关,它获取印度字符的 byte[] 数组并将其转换为通过电子邮件转发的可读字符串。在 Win 机器中,此代码正在运行:
byte[] data= ....;
shortMessage = new String(data, GSMCharset.forName("UTF-16"));
然而,在 Linux 中,它是垃圾。
我尝试了其他字符集选项,但都没有给我任何东西。任何想法如何使它在 Linux 上工作。
(数据编码 == 8)
似乎输出的编码是由源文件的编码控制的。除非在编译时指定(如何指定 Java 源文件的编码?),否则默认编码是从 OS 继承的。
我猜你使用的 Windows 机器有一个默认编码,导致你期望的输出,而 Linux 机器没有。有关报告的类似问题,请参阅此问题 - Charset of Java source file and failed 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"));
就我而言,它是我 Mac 上的“MacRoman”。输出是这样的:
MacRoman
[9, 22, 9, 65, 9, 54, 9, 22, 9, 44, 9, 48, 9, 64]
???????
我更改了源文件的编码(参见源文件的“属性”)。又跑了。输出是这样的:
UTF-8
[9, 22, 9, 65, 9, 54, 9, 22, 9, 44, 9, 48, 9, 64]
खुशखबरी