2

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

我在 java Web 服务中有一个 PDF 字节 [],我必须将其作为 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)之外,我还必须将原始 byte[] 转换为 UTF-16LE byte[]...

我试过这个:

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 的算法?

提前致谢!

4

3 回答 3

2

您不需要代理对;它们是用于处理基本多语言平面 (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

于 2011-12-16T12:44:04.130 回答
2
byte[] encoded = new String(b, "windows-1252").getBytes("UTF-16LE");
于 2011-12-16T12:58:19.773 回答
0

我终于找到了解决方案。看起来只有从 128 到 159 的字节需要代理对。我使用这段代码来模拟 .NET Unicode 编码:

public class Encoder {
   static Map<Integer, Integer> mapTiny = new HashMap<Integer, Integer>() {
        public Integer get(Object key) {
            Integer code = super.get(key);
            if (code == null)
                code = (Integer) key;
            return code;
        }
    };

    static {
        mapTiny.put(128,8364);
        mapTiny.put(130,8218);
        mapTiny.put(131,402);
        mapTiny.put(132,8222);
        mapTiny.put(133,8230);
        mapTiny.put(134,8224);
        mapTiny.put(135,8225);
        mapTiny.put(136,710);
        mapTiny.put(137,8240);
        mapTiny.put(138,352);
        mapTiny.put(139,8249);
        mapTiny.put(140,338);
        mapTiny.put(142,381);
        mapTiny.put(145,8216);
        mapTiny.put(146,8217);
        mapTiny.put(147,8220);
        mapTiny.put(148,8221);
        mapTiny.put(149,8226);
        mapTiny.put(150,8211);
        mapTiny.put(151,8212);
        mapTiny.put(152,732);
        mapTiny.put(153,8482);
        mapTiny.put(154,353);
        mapTiny.put(155,8250);
        mapTiny.put(156,339);
        mapTiny.put(158,382);
        mapTiny.put(159,376);
    }


public static String encode(byte[] b) throws IOException {

        ByteArrayInputStream in = new ByteArrayInputStream(b);
        ByteArrayOutputStream convFileByteArray = new ByteArrayOutputStream();
        int i = in.read();
        while (i != -1) {
            convFileByteArray.write(new byte[] { (byte) (mapTiny.get(i) & 0xff), (byte) ((mapTiny.get(i) >> 8) & 0xff) });
            i = in.read();
        }
        return Base64.encodeToString(convFileByteArray.toByteArray(), false);
    }

}
于 2011-12-22T14:13:14.097 回答