2

私はこれを達成しようとしています:

ファイルを再構築するためにこれを行う.NETクライアントにbase64文字列として送信する必要があるJava WebサービスにPDFバイト[]があります。

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);

さまざまな方法 (org.apache.commons.codec.binary.Base64 など) で作成できる 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
byte[] encoded = new String(b, "windows-1252").getBytes("UTF-16LE");
于 2011-12-16T12:58:19.773 に答える
2

サロゲート ペアは必要ありません。これらは Basic Multilingual Plane (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 に答える
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 に答える