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