gpt4 book ai didi

java - Unicode base 64编码与java

转载 作者:搜寻专家 更新时间:2023-11-01 02:16:18 25 4
gpt4 key购买 nike

我正在尝试将 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"));

关于java - Unicode base 64编码与java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5701041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com