org.apache.commons.codec.DecoderException:奇数个字符
Posted
技术标签:
【中文标题】org.apache.commons.codec.DecoderException:奇数个字符【英文标题】:org.apache.commons.codec.DecoderException: Odd number of characters 【发布时间】:2015-03-10 09:01:02 【问题描述】:在 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;
现在我正在尝试将十六进制字符串 419
解析为 java 代码中的俄语字符 Й
,如下所示
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()
。
【问题讨论】:
找到解决方案了吗? 有什么解决办法吗? 【参考方案1】:改用 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
【讨论】:
【参考方案2】:在您提到的情况下,Й 是 U+0419,大多数西里尔字符都以前导 0 开头。这显然意味着在转换之前在奇数字符数组之前添加 0 会有所帮助。
测试 javascript 似乎只对 1 个字母长的字符串是安全的:Ѓ(U+0403) 返回 403,Ѕ(U+0405) 返回 405,但 ЃЅ 返回 403405 而不是 04030405 或 4030405,这是偶数更糟糕的是,因为它是偶数并且不会触发异常并且可以解码为完全不同的东西。
This 处理前导零填充的问题可能有助于 javascript 部分。
【讨论】:
【参考方案3】:代替
sb.append(new String(bytes,"UTF-8"));
试试这个
sb.append(new String(bytes,"Windows-1251"));
【讨论】:
以上是关于org.apache.commons.codec.DecoderException:奇数个字符的主要内容,如果未能解决你的问题,请参考以下文章
线程“主”java.lang.NoClassDefFoundError 中的异常:org/apache/commons/codec/DecoderException
Android 开发:Java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.encodeBase64String()
ANDROID : java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.encodeBase64String in
Handler processing failed; nested exception is java.lang.NoSuchMethodError: org.apache.commons.codec
如何使用org.apache.commons.codec.binary.base64对Java对象进行Base64编码?