java - 如何将 128 到 255 的字节映射到等效的 UTF16-LE 代理项对

标签 java unicode utf-16 surrogate-pairs

我正在努力实现这一目标:

我在 java web 服务中有一个 PDF byte[],我必须将其作为 base64 字符串发送到 .NET 客户端,以便重建文件。

Encoding.Convert(Encoding.Unicode, Encoding.Default, Convert.FromBase64String(inputJava))

我无法更改客户端代码,现在 Java Web 服务正在调用另一个 .NET Web 服务,该服务将 byte[] 转换为 Base64 字符串:

System.Text.Encoding.Convert(System.Text.Encoding.GetEncoding(1252), System.Text.Encoding.Unicode, b);

除了我可以通过各种方式制作的base64(例如使用org.apache.commons.codec.binary.Base64)之外,我还必须将原始字节[]转换为UTF-16LE字节[]...

我试过这个:

byte[] output = new byte[b.length * 2];
for(int i=0; i < b.length; i++) 
{
  int val = b[i];
  if(val < 0) val += 256;

  output[2*i + 0] = (byte) (val);   
  output[2*i + 1] = 0; 
}

这对于低于 128 的值(例如 1 => 0100, 2 => 0200, ... , 127 => 7F00)效果很好,但对于高于 (128 -> 255) 的值我不知道如何获取等效的 2 字节值;我知道对于字节 156 (9C),对应的值为 8301 (0x5301),对于字节 224 (E0),对应的值为 12501 (0x7D01),但我没有找到一种算法来获取所有其他值。

字节值和相应的 UTF-16LE 代理对之间是否存在映射表或将值从 128 映射到 255 的算法?

提前致谢!

最佳答案

你不需要代理对;它们是用于处理基本多语言平面 (BMP) 之外的字符的构造,并且所有 windows-1252 字符都在 BMP 中。

官方的 windows-1252(别名 cp1252)到 Unicode 映射表是 http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT 它是一个易于处理格式的纯文本文件,因此如果您找不到用于转换的现有工具,那么基于该文件编写映射应该相当简单。

该文件在官方 IANA 注册表中被间接引用: http://www.iana.org/assignments/character-sets

关于java - 如何将 128 到 255 的字节映射到等效的 UTF16-LE 代理项对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8534159/

相关文章:

vim - 输入带有 8 位十六进制代码的 Unicode 字符

java - Java中如何获取应用程序的安装路径?

java - @Inject 和 @Named 注释给出 NoSuchBeanDefinitionException

c# - 使用正则表达式匹配 C# Unicode 标识符

regex - RE2 和 UTF16(或 UCS-2)

java - Java 字符串的实例是否总是有效的 UTF-16?

java - 检索传递给 JVM 的主类/jar 文件名

java - 逐个字符地从文本文件中读入

由于unicode字符,Powershell脚本无法运行

java - 检查设备是否支持 Unicode?