似乎memcache客户端不支持UTF-8字符串作为其密钥。但我必须使用i18n。无论如何要解决它?
java.lang.IllegalArgumentException:键包含无效字符:``HK:00:A Kung Wan'' 在net.spy.memcached.MemcachedClient.validateKey(MemcachedClient.java:232) 在net.spy.memcached.MemcachedClient.addOp(MemcachedClient.java:254)
答案 0 :(得分:12)
这里的问题不是UTF编码。这是你的密钥包含空格的事实。键不能包含空格,换行符,回车符或空字符。
产生异常的代码行在
之下if (b == ' ' || b == '\n' || b == '\r' || b == 0) {
throw new IllegalArgumentException
("Key contains invalid characters: ``" + key + "''");
}
答案 1 :(得分:0)
处理具有特殊字符,控制字符,新行,空格,unicode字符等的所有memcached键的一般解决方案是在将密钥传递给set()和get()方法之前对其进行base64编码。 memcached的。
// pseudo code for set
memcachedClient.set(Base64.encode(key), value);
// pseudo code for get
memcachedClient.get(Base64.decode(key), value);
将它们转换为memcached保证可以理解的字符。 此外,base64编码没有性能损失(除非你是一个纳米性能优化人员),base64是可靠的,只需要大约30%的额外长度。
像魅力一样!