正在发送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()
。
3条答案
按热度按时间yqkkidmi1#
改用Base64
but5z9lq2#
在你提到的例子中,是U+0419,大多数西里尔字符都以0开头,这显然意味着在转换前在奇数字符数组前加一个0会有所帮助。
测试javascript似乎只对1个字母长的字符串是安全的:(U+0403)返回403,(U+0405)返回405,但返回403405而不是04030405或4030405,这更糟糕,因为它是偶数,不会触发异常,可能解码为完全不同的内容。
This问题处理用前导零填充可能对javascript部分有帮助。
7z5jn7bk3#
代替
试试这个