之前在做一个项目的时候, 遇到了需要用golang做繁简体转换的需求.
经过一番调查, 发现并没有类似用纯golang做的开源项目. 而自己也不想从头写一个(毕竟时间有限, 能力也有限), 于是选择利用python强大的库来做繁简体转换, 然后golang调用即可.
这里面难点有两个:
- 如何用python进行繁简体转换
- 利用golang调用python封装好的繁简体转换函数
一 如何用Python进行繁简体转换
这个网上也有很多教程:
比如可以利用openccpy进行繁简体转换:
https://blog.51cto.com/9250070/2376916
也可以用zh_wiki.py及langconv进行繁简体转换:
https://blog.csdn.net/thomashtq/article/details/41512359
这里我采用的是后者, 因为比较好实现:
这里做个复读机, copy一下, 方便阅读:
1、下载zh_wiki.py 和 langconv
2、将下载的 langconv.py 和 zh_wiki.py,放在python代码所在目录即可使用
font-convert.py
python2.7Linux
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
# font-convert.py
from langconv import *
def simple2tradition(src):
#将简体转换成繁体
target= Converter('zh-hant').convert(src.decode('utf-8'))
target= target.encode('utf-8')
return target
def tradition2simple(src):
# 将繁体转换成简体
target= Converter('zh-hans').convert(src.decode('utf-8'))
target= target.encode('utf-8')
return target
二 利用golang调用python封装好的繁简体转换函数
上面我们已经将函数封装好, 接下来就是怎么用golang去调用它了.
这里我们利用 github.com/sbinet/go-python 这个封装好的包
在安装这个包之前, 需要先配置一下环境:
sudo apt-get update
sudo apt-get install pkg-config
sudo apt-get install python-dev
go get github.com/sbinet/go-python
首先更新源, 然后后配置pkg-config, 不然在安装python-dev的时候会出问题. python-dev是给go-python提供Python.h 头文件环境
如果出了问题可以参考下面我的博客, 或者留言:
ubuntu下安装python-dev遇到的问题
pkg-config: exec: “pkg-config”: executable file not found in $PATH
现在环境搭建好了, 开始写代码:
// font-convert.go
package convert
import (
"encoding/json"
"github.com/sbinet/go-python"
"log"
)
var (
simple2tradition *python.PyObject // 简体转繁体函数变量
tradition2simple *python.PyObject // 繁体转简体函数变量
)
// go build main.go && PYTHONPATH=./convert ./main
func init() {
err := python.Initialize() // 初始化
if err != nil {
log.Fatal(err)
}
fontConvert := python.PyImport_ImportModule("font-convert") // 导入之前的模块, 也就是 font-convert.py 这个文件
if fontConvert == nil {
panic("Error importing module")
}
simple2tradition = fontConvert.GetAttrString("simple2tradition") // 获取模块中定义的函数 simple2tradition
if simple2tradition == nil {
panic("Error importing function")
}
tradition2simple = fontConvert.GetAttrString("tradition2simple") // 获取模块中定义的函数 tradition2simple
if tradition2simple == nil {
panic("Error importing function")
}
}
// 释放函数
func PythonFinalize() {
python.Finalize()
}
// src:源字符串
// condition: 转换条件, 转换为繁体还是简体
func FontConvert(src, condition string) string {
bArgs := python.PyTuple_New(1)
err := python.PyTuple_SetItem(bArgs, 0, python.PyString_FromString(src))
if err != nil {
panic(err)
}
var res *python.PyObject
if condition == "traditional" {
res = simple2tradition.Call(bArgs, python.PyDict_New())
} else if condition == "simplified" {
res = tradition2simple.Call(bArgs, python.PyDict_New())
} else {
return src
}
return python.PyString_AS_STRING(res)
}
最后看一下文件组织目录:
运行命令:
go build main.go && PYTHONPATH=./convert ./main
PYTHONPATH=./convert
如果觉得上面的很麻烦, 这里有一个简单的golang调用python的示例:
https://www.datadoghq.com/blog/engineering/cgo-and-python/