在调试py2neo的程序的时候,苏南大叔发现,py2neo输出带有中文的节点的时候,显示乱码。那么,如何解决这个中文乱码问题呢?需要设置什么呢?是需要像 python2 一样处理,还是需要设置 shebang 行?

苏南大叔:neo4j图数据库,py2neo如何处理中文输出乱码问题? - py2neo-cn-issue
neo4j图数据库,py2neo如何处理中文输出乱码问题?(图4-1)

大家好,这里是苏南大叔的“程序如此灵动”博客,这里记录苏南大叔和计算机代码的故事。本文记录py2neo程序中,如何处理节点属性中文乱码的问题。本文测试环境:win10neo4j@4.4.5,python@3.6.8py2neo@2021.2.3

测试数据

苏南大叔:neo4j图数据库,py2neo如何处理中文输出乱码问题? - 初始数据
neo4j图数据库,py2neo如何处理中文输出乱码问题?(图4-2)

测试代码:

from py2neo import Graph, Node, Relationship,NodeMatcher
graph = Graph('http://localhost:7474',auth=("neo4j","neo4j"))
data = graph.run("match(n) return n").data()
print(data)

from py2neo import Node, Relationship
a = Node('Person', name='苏南')
b = Node('Person', name='Bob')
r = Relationship(a, 'KNOWS', b)
print(a, b, r)

输出结果:

苏南大叔:neo4j图数据库,py2neo如何处理中文输出乱码问题? - 结果输出
neo4j图数据库,py2neo如何处理中文输出乱码问题?(图4-3)

结果显示:py2neo的代码中,对于数据库中的中文属性,是可以友好输出的。但是对于自己自定义的节点属性中文,是不能完美输出的。(注意\u开头的字样,其实也不能说是乱码,只不过是编码方式不同罢了)

解决方案

这个结局方案,先找到py2neo模块的物理位置,可以参考下面这篇文章:

物理位置是:

C:\Users\sunan\AppData\Local\Programs\Python\Python36-32\Lib\site-packages\py2neo

然后,找到下面这个文件的第132行:

<path>/cypher/encoding.py
parts[i] = (X_ESCAPE.sub(u"\\\\u00\\2", parts[i].encode("unicode-escape").decode("utf-8")).

修改为:

parts[i] = (X_ESCAPE.sub(u"\\\\u00\\2", parts[i].encode("unicode-escape").decode("unicode-escape")).

如下是相同代码的运行结果对比:

苏南大叔:neo4j图数据库,py2neo如何处理中文输出乱码问题? - 修改结果
neo4j图数据库,py2neo如何处理中文输出乱码问题?(图4-4)

参考文献

综述

解决中文乱码的问题,似乎是个永恒的话题,隔三岔五就出来一个。不过,这篇文章中的解决方案并不是很完美,修改了py2neo的源码。大家有更好的办法的话,可以留言给我。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。