Redis里中文显示不对劲,存进去的汉字全变乱码了咋整啊
- 问答
- 2026-01-02 02:49:26
- 6
这个问题真的太常见了,十个刚开始用Redis的人里,得有八个会碰上汉字变成一堆问号或者奇怪符号的情况,别慌,这绝对不是Redis坏了,也不是你的汉字有问题,基本上都是因为“编码”没对上号,你可以把它想象成你和Redis之间说的“暗号”不一致,你用中文说“你好”,Redis却用英文的规则去听,那可不就听岔劈了嘛,下面咱们就一步步捋清楚,问题最可能出在哪儿以及怎么解决。
最最最常见的“案发现场”是在你通过命令行工具redis-cli查看数据的时候,你兴冲冲地用set name "张三"存进去,然后一get name,咦,屏幕上显示的不是“张三”,可能是\xe5\xbc\xa0\xe4\xb8\x89这种像乱码的字符,或者干脆就是,这种情况,八成是redis-cli的显示问题。
根据网络上的大量经验分享(比如很多程序员在博客和论坛里的讨论),redis-cli默认的显示模式是直接输出原始字节,它不太智能,不会自动帮你把这些字节转换成好看的中文,那些\xe5\xbc\xa0\xe4\xb8\x89其实就是“张三”这两个字的UTF-8编码的十六进制形式,它本身是对的,只是显示出来不友好,怎么办呢?你在启动redis-cli的时候,可以加一个参数:redis-cli --raw,这个--raw的意思就是“原始模式”,它会告诉命令行:“别整那些花里胡哨的,直接把我当成一个能显示各种字符的终端来处理。” 这样一来,你再用get name,大概率就能看到正确的“张三”了,这是你应该检查的第一步,也是最容易解决的问题。
如果加了--raw还是乱码,或者你是在自己的程序代码里(比如用Java的Jedis、Python的redis-py等)发现存进去或取出来的中文不对,那问题就深入了一层,可能出在“客户端编码”和“服务器编码”的匹配上。
Redis服务器本身就像一个保险箱,它不怎么关心你存进去的是中文、英文还是图片代码,它一律当作字节序列来存储,乱码的根源通常不在Redis服务器端,而在于你的应用程序(客户端)在把字符串交给Redis时,是如何把它转换成字节的;以及在取回字节后,又是如何把这些字节解读成字符串的,这个过程就是“编码”和“解码”。

根据软件开发中的常见实践,绝大多数现代编程语言和系统都推荐使用UTF-8编码来处理文本,因为它能完美支持全世界几乎所有语言的字符,你的乱码问题,很大概率是因为在某个环节,没有统一使用UTF-8。
比如说,你用Python写程序:
- 存数据时:你的Python脚本默认是用UTF-8编码的字符串,然后用redis-py库发送给Redis,如果这个过程没问题,Redis里存的字节就是正确的UTF-8编码。
- 取数据时:Python的redis-py库默认也会尝试用UTF-8编码把取回来的字节解码成字符串,如果这里匹配上了,那就万事大吉。
但有时候会出岔子,你的Python源文件本身是用GBK编码保存的(在一些旧版本的Windows系统或特定IDE中可能出现),那么字符串“张三”在Python内存中可能就已经不是标准的UTF-8表示了,或者,你在连接Redis客户端时,有些古老的库或罕见的配置可能会允许你指定其他编码(如ASCII、GBK等),如果设置错了,编码解码一错位,乱码就产生了。

对于Java程序也是如此,Java内部字符串是Unicode表示的,但在和外部系统(如Redis)交互时,需要转换为字节数组,常用的Jedis客户端在默认情况下会使用UTF-8进行编码和解码,你需要确保你的Java项目处理字符串的方式是一致的。
解决方案的核心思路就是确保全链路都用UTF-8:
- 检查你的源代码文件编码:确保你的.py、.java等源文件保存为UTF-8编码,在IDE(如VSCode、PyCharm、IntelliJ IDEA)的设置里都能找到文件编码的设置,把它设为UTF-8。
- 检查客户端库的配置:查阅你所用的Redis客户端库的文档,看是否有设置编码的地方,绝大多数主流客户端默认就是UTF-8,一般无需改动,但如果你怀疑这里被改动了,或者使用了非主流库,请显式地将其配置为UTF-8。
- 检查终端或控制台的编码:即使你的程序处理正确,如果你是在终端(比如Windows的CMD或PowerShell)里打印输出,也需要终端的编码支持UTF-8,新版本的Windows Terminal和PowerShell通常默认已是UTF-8,但旧的CMD可能默认是GBK,这会导致程序输出正确,但显示到屏幕上却是乱码,可以尝试在终端中执行命令
chcp 65001来将当前代码页临时切换为UTF-8看看效果。
还有一种相对少见但确实存在的情况,就是在Redis的配置文件中可能有限制,根据Redis官方文档的说明,Redis本身对存储的数据格式没有限制,极其灵活,在某些非常特殊的配置下,比如使用了某些第三方的Redis代理或特定的序列化方式,可能会引入编码问题,对于99%的简单使用场景,问题都不会出在Redis服务器配置上。
当你遇到Redis中文乱码时,别急着动服务器配置,按这个顺序排查:
- 第一站:如果你是用
redis-cli看数据,试试redis-cli --raw。 - 第二站:检查你的应用程序代码,确保从源文件编码到客户端库的编码解码,整个链条都统一使用UTF-8。
- 第三站:检查你显示结果的终端或日志系统的编码是否支持UTF-8。
基本上,遵循这个路径,你的中文乱码问题都能迎刃而解,关键就是让所有环节在“编码”这件事上达成共识,都说同一种“语言”——那就是UTF-8。
本文由歧云亭于2026-01-02发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/72822.html
