在url参数中发送十六进制字符串并尝试将其转换为服务器端的字符串。 使用以下javascript编码代码转换用户输入字符串
function encode(string) {
var number = "";
var length = string.trim().length;
string = string.trim();
for (var i = 0; i < length; i++){
number += string.charCodeAt(i).toString(16);
}
return number;
}
现在我尝试在java代码中解析俄语字符419
的十六进制字符串Й
,如下所示
byte[] bytes = "".getBytes();
try {
bytes = Hex.decodeHex(hex.toCharArray());
sb.append(new String(bytes,"UTF-8"));
} catch (DecoderException e) {
e.printStackTrace(); // Here it gives error 'Odd number of characters'
}catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
但它会出现以下错误
"org.apache.commons.codec.DecoderException: Odd number of characters."
如何解决。因为有许多俄语字符有十六进制代码3位数,因此它无法将其转换为.toCharArray()
答案 0 :(得分:0)
改为使用Base64
val aes = KeyGenerator.getInstance("AES")
aes.init(128)
val secretKeySpec = aes.generateKey()
val base64 = Base64.encodeToString(secretKeySpec.encoded, 0)
val bytes = Base64.decode(base64, 0)
SecretKeySpec(bytes, 0, bytes.size, "AES") == secretKeySpec
答案 1 :(得分:0)
在您提到Й是U + 0419的情况下,大多数西里尔字符以0开头。这显然意味着在转换前在奇数字符数组前添加0会有所帮助。
测试javascript似乎仅对1个字母长的字符串可能是安全的:Ѓ(U + 0403)返回403,Ѕ(U + 0405)返回405,但是ЃЅ返回403405而不是04030405或4030405,甚至更糟糕的是,因为它是偶数的,并且不会触发异常,并且可以解码为完全不同的东西。
This有关用前导零填充的问题可能有助于javascript部分。
答案 2 :(得分:-1)
而不是
sb.append(new String(bytes,"UTF-8"));
试试这个
sb.append(new String(bytes,"Windows-1251"));