簡體   English   中英

使用java的Unicode base 64編碼

[英]Unicode base 64 encoding with java

我正在嘗試編碼和解碼UTF8字符串到base64。 理論上不是問題,但解碼時似乎永遠不會輸出正確的字符而是?


        String original = "خهعسيبنتا";
        B64encoder benco = new B64encoder();
        String enc = benco.encode(original);
        try
        {
            String dec = new String(benco.decode(enc.toCharArray()), "UTF-8");
            PrintStream out = new PrintStream(System.out, true, "UTF-8");
            out.println("Original: " + original);
            prtHx("ara", original.getBytes());
            out.println("Encoded: " + enc);
            prtHx("enc", enc.getBytes());
            out.println("Decoded: " + dec);
            prtHx("dec", dec.getBytes());
        } catch (UnsupportedEncodingException e)
        {
            e.printStackTrace();
        }

控制台的輸出如下:

原文:خهعسيبنتا
ara = 3F,3F,3F,3F,3F,3F,3F,3F,3F
編碼:Pz8 / Pz8 / Pz8 /
enc = 50,7A,38,2F,50,7A,38,2F,50,7A,38,2F
解碼:?????????
dec = 3F,3F,3F,3F,3F,3F,3F,3F,3F

prtHx只是將字節的十六進制值寫入輸出。 我在做一些明顯不對的事嗎?


Andreas通過強調getBytes()方法使用平台默認編碼(Cp1252)來指出正確的解決方案,即使源文件本身是UTF-8。 通過使用getBytes(“UTF-8”),我能夠注意到編碼和解碼的字節實際上是不同的。 進一步調查表明,編碼方法使用了getBytes()。 改變這個很好地解決了這個問題。


try
        {
            String enc = benco.encode(original);
            String dec = new String(benco.decode(enc.toCharArray()), "UTF-8");
            PrintStream out = new PrintStream(System.out, true, "UTF-8");
            out.println("Original: " + original);
            prtHx("ori", original.getBytes("UTF-8"));
            out.println("Encoded: " + enc);
            prtHx("enc", enc.getBytes("UTF-8"));
            out.println("Decoded: " + dec);
            prtHx("dec", dec.getBytes("UTF-8"));

        } catch (UnsupportedEncodingException e)
        {
            e.printStackTrace();
        }

系統編碼Cp1252
原文:خهعسيبنتا
ori = D8,AE,D9,87,D8,B9,D8,B3,D9,8A,D8,A8,D9,86,D8,AA,D8,A7
編碼:2K7Zh9i52LPZitio2YbYqtin
enc = 32,4B,37,5A,68,39,69,35,32,4C,50,5A,69,74,69,6F,32,59,62,59,71,74,69,6E
解碼:خهعسيبنتا
dec = D8,AE,D9,87,D8,B9,D8,B3,D9,8A,D8,A8,D9,86,D8,AA,D8,A7

謝謝。

String#getBytes()使用平台的默認字符集對字符進行編碼。 字符串文字"خهعسيبنتا"的實際編碼在java源文件中"خهعسيبنتا"已定義”(您在創建或保存文件時選擇字符編碼)

這可能是為什么ara編碼為0x3f字節的原因。

嘗試一下:

out.println("Original: " + original);
prtHx("ara", original.getBytes("UTF-8"));
out.println("Encoded: " + enc);
prtHx("enc", enc.getBytes("UTF-8"));
out.println("Decoded: " + dec);
prtHx("dec", dec.getBytes("UTF-8"));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM