java - 在 windows 和 linux 中转换字符集

标签 java linux character-encoding utf-16 smpp

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

byte[] data= ....;
shortMessage = new String(data, GSMCharset.forName("UTF-16"));

然而,在 Linux 中,它会产生垃圾。

我尝试了其他字符集选项,但都没有任何结果。 关于如何使其在 Linux 上运行的任何想法。

(数据编码 == 8)

最佳答案

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

我猜您使用的 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"));

使用操作系统默认编码

就我而言,它是我 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]
खुशखबरी

关于java - 在 windows 和 linux 中转换字符集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17271343/

相关文章:

java - GSON反序列化字符串或字符串数​​组

java - 使用递归反转字符串

c - 使用GDB调试时如何打印指针指向的字符串?

mysql - 我怎么知道给定的十六进制使用什么编码?

java - 如何反序列化未知类的对象

JavaFX ComboBox 样式(禁用伪类)

linux - 如果 256 个线程比 8 个线程提供更好的性能,我可能采用了错误的方法吗?

linux - 在脚本 bash 上选择特定值

php - 通过 PHP 从 Facebook JSON 到 HTML 的字符编码问题

character-encoding - 考虑到输出编码通常通过其他方式固定,mb_http_output() 有什么用处?