我正在从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格式转换。有人请帮忙!
答案 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")
(如果这不起作用,请检查所需的编码)。