问题描述:
使用Graphviz绘制中文依存句法分析树的时候发现输出的中文结点乱码,不能正常显示中文,如下图所示:
分析:
Graphviz 绘图时所使用的语言叫作"dot"。使用dot 语言,第一步就是决定要画哪种图。图分两种:有向图与无向图。
有向图以digraph声明图片,节点间的关系写为"->"; 无向图以graph 声明图片,节点间的关系可以写为"--"。
画图时需要对图片做一些特别的处理,例如加粗、把图变色等。我们要控制这些东西,就需要用到属性。
属性有四种:
- 用在节点上(Node, N) ;
- 用在线段上(Edge, E);
- 用在根图片上(Graph, G);
- 用在子图片上(Cluster subgraph, C)
对于节点(node) 的属性,有以下几种指定法:
- 节点名[节点属性名=值];
- 节点名[节点属性名=值,节点属性名=值];
- node [节点属性名=值,节点属性名=值];
属性指定的语句必须要被中括号括起。当一次指定多值时,需用英文逗点隔开。第三行中的node 是个关键字,用来代称「图片范围内」所有「还没创建」的节点,或者您也可将它理解为:在当前大括号的范围内,所有尚未创建节点的属性预设值,会被这个语句给变更。
对于线段(edge)的属性指定,与上述节点属性指定方式很类似:
- 节点名->节点名[线段属性名=值];
- 节点名--节点名[线段属性名=值,线段属性名=值];
- edge [线段属性名=值,线段属性名=值]; 其中edge 是关键字。
可见以下两个例子pic2.dot和pic1.dot。其中pic1.dot描述了一个无向图,即用不带箭头的直线表示节点之间的联系的图;pic2.dot描述了一个有向图,有向图不仅能表示节点之间的联系,而且能用箭头表示节点之间流动的方向。它的线段(edge)的属性有style和color,属性值分别是filled和blue。
digraph pic2 {
a -> b
a -> b
b -> a [style=filled color=blue]
}
graph pic1 {
a -- b
a -- b
b -- a [color=blue]
}
解决方法:
graphviz默认设置下是不支持中文,如果在dot文件中直接写中文,会显示成乱码,要解决这个问题要做两件事,
1、把源文件保存为UTF-8的格式
2、设置fontname,也就是在node属性里添加fontname一项。例如下图标记处fontname="FangSong"表示结点中字体用仿宋体。
验证执行结果:
附:Windows系统中文字体的英文名
- 新細明體:PMingLiU
- 細明體:MingLiU
- 標楷體:DFKai-SB
- 黑体:SimHei
- 宋体:SimSun
- 新宋体:NSimSun
- 仿宋:FangSong
- 楷体:KaiTi
- 仿宋_GB2312:FangSong_GB2312
- 楷体_GB2312:KaiTi_GB2312
- 微軟正黑體:Microsoft JhengHei
- 微软雅黑体:Microsoft YaHei
参考文献:
1. http://blog.chinaunix.net/uid-24118190-id-3852456.html
2. https://www.cnblogs.com/luhouxiang/p/6193222.html
3. https://blog.csdn.net/xiajian2010/article/details/23748557