redis中的字符编码/解码

时间:2018-02-20 12:13:30

标签: java unicode utf-8 redis character-encoding

我正在从Redis检索一些特殊字符到Java程序,但这些字符没有被正确编码/解码。这些字符已从api访问,插入到redis缓存中,然后在java程序中使用。

On Postman(REST客户端):

[^!-~°-µ\\\\s±–—‐“”’¼-¾]

在Redis缓存控制台(redis-cli.exe)上:

[^!-~\xef\xbf\xbd\xef\xbf\xbd-\xef\xbf\xbd\xef\xbf\xbd\\\\\\\\s\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd-\xef\xbf\xbd\xef\xbf\xbd]

在Java程序中:

[^!-~��-��\s����������������������-��]

不知道这里发生了什么!为什么这些字符已经以xxx格式转换。有人请帮忙!

2 个答案:

答案 0 :(得分:1)

我可以解释你看到的内容,但我无法解决问题。

°是unicode字符DEGREE SIGN或U + 00B0,并以UTF-8编码为\xc2\xb0

μ是unicode字符GREEK SMALL LETTER MU或U + 03BC,并以UTF-8编码为\xce\xbc

是unicode字符REPLACEMENT CHARACTER或U + FFFD,并以UTF-8编码为\xef\xbf\xbd

您的帖子表明,在Redis控制台和Java程序中,每个非ascii字符都被替换(我不知道如何),并且有两个替换字符。当Redis控制台输出其UTF-8表示时,Java程序正确输出字符。

我怀疑这些字符最初是以UTF-8传递的,并且在0x7F上使用了2个字节。但是当它被转换为Java 16位字符时,用于解码的字符集是简单的ascii,并且所有字符都被转换为unicode替换字符。如果没有明确解释确切的工作流程,我就不能说更多。

答案 1 :(得分:0)

我观察到与Windows机器上的字符集相关的类似问题。无论您在何处处理此输入流,都使用Charset.forName("windows-1252")(如果这不起作用,请检查所需的编码)。