【问题标题】:UTF-16BE to UTF-16LE, and backUTF-16BE 到 UTF-16LE,然后返回
【发布时间】:2012-08-24 01:05:55
【问题描述】:

我有一个正在处理的 Blackberry 项目,我需要将使用 UTF-16LE(小端)编码的字符串字节数组转换为 UTF-16BE(大端)编码的字符串字节数组,并且可见。反之亦然。我正在连接的服务器正在以 UTF-16LE 编码发送 BlackBerry 设备字节字符串数组,但该设备本身并不支持 UTF-16LE。当我尝试将字节数组解码回字符串时,字符串难以辨认。但是,该设备确实支持 UTF-16BE。我还需要反转这个过程,即将具有 UTF-16BE 编码的字符串的字节数组转换为服务器所期望的 (UTF-16LE)。谢谢。

无法在设备上执行此操作:

String test = "test";
byte[] testBytes = test.getBytes("UTF-16LE");// throws UnsupportedEncodingException

可以这样做:

String test = "test";
byte[] testBytes = test.getBytes("UTF-16BE");//works

【问题讨论】:

  • 如果你只使用byte[] testBytes = test.getBytes("UTF-16"),你会得到什么?您的服务器是否将正确的 BOM 字符放在字符串的开头,并且 Blackberry 是否会自动检测大端?
  • @HeatfanJohn test.getBytes("UTF-16") 也会引发异常。我不确定服务器是否将 BOM 放在字符串的开头。它是一个 ASP.Net ADFS 服务器(如果有帮助的话)。黑莓不会自动检测。谢谢。

标签: blackberry unicode java-me


【解决方案1】:

UTF-16 每个代码单元使用两个字节,其中一些 Unicode 代码点使用一个代码单元编码,而其他代码点使用两个代码单元(称为代理对)。

要在 UTF-16LE 和 UTF-16BE 之间进行转换,只需循环交换每个代码单元的每个 2 字节对的顺序的字节即可。代理代码单元的顺序在 LE 和 BE 之间没有变化。 IOW,只需将字节 0 和 1 相互交换,将字节 2 和 3 相互交换,依此类推。

【讨论】:

  • 我明白了。我会尝试并报告。谢谢!
猜你喜欢
  • 2014-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
相关资源
最近更新 更多