一个用Go写的汉字转拼音小程序

陪她去流浪 桃子 2018年02月05日 编辑 阅读次数:8241

这是一个 Go 语言练习,用来将汉字转换成拼音的小程序。

项目地址:movsb/py4zh - GitHub

手机QQ语音口令红包

手机QQ在2017年底的时候推出了语音口令红包。不同于以往的普通红包以及文字口令红包得来毫不费工夫,语音口令红包需要红包领取者正常朗读出语音口令红包的语音才可以领取。 说起来本身并不难,但是有些人却煞费苦心,把语音口令的文字设置得特别难读,特别特别偏。比如常见的绕口令,前鼻音、后鼻音分不清的,繁体字,生僻字,等等。我估计汉语专业的人都非常难以保证读得对。而且这些字有些笔划太过于复杂,根本连识别都很难。

怎么「破解」这些高难度的字呢?

值得庆幸的是,QQ在这之前推出了「提取图中文字」的功能,整体来说识别效果还不错,但也经常能遇到不能识别的。

对于那些生僻字来说,他们通过把文字识别出来,然后在网上找个能把文字翻译成拼音的工具翻译出拼音,于是就知道怎么读了,绝大多数都能正常领取。

我写了个汉字转拼音的

首先说目的:为了练习Go语言写网络程序。

拼音来源:百度汉语,比如:雪,http://hanyu.baidu.com/s?wd=%E9%9B%AA&ptype=zici。 替换网址中的 wd 参数即可修改查询的汉字,查询结果在选择器 #pinyin > span > b 下。

代码采用了Go语言天生的 goroutine 实现多协程抓取页面源代码,抓取后采用类似 jQuery 语法的 Go语言版本 goquery 来提取页面元素。

百度汉语的查询页面:

完整源代码如下(不到100行,新手代码):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package main
import (
	"log"
	"net/url"
	"os"
	"unicode/utf8"

	"github.com/PuerkitoBio/goquery"
)

var logf = log.Printf
var logn = log.Println

var runelen = utf8.RuneCountInString

type xResult struct {
	index   int
	char    string
	pinyins []string
}

func getPinyin(r rune, i int, rch chan<- xResult) {
	u := "http://hanyu.baidu.com/s?wd="
	u += url.QueryEscape(string(r))
	u += "&ptype=zici"

	result := xResult{index: i, char: string(r)}
	doc, err := goquery.NewDocument(u)

	if err == nil {
		doc.Find("#pinyin > span > b").Each(func(_ int, s *goquery.Selection) {
			result.pinyins = append(result.pinyins, s.Text())
		})
	}

	rch <- result
}

func getPinyins(words string) (pys []xResult) {
	n := runelen(words)
	if n <= 0 {
		return nil
	}

	pys = make([]xResult, n)
	rch := make(chan xResult)

	index := 0

	for _, word := range words {
		go getPinyin(word, index, rch)
		index++
	}

	for i := 0; i < n; i++ {
		ret := <-rch
		pys[ret.index] = ret
	}

	return pys
}

func main() {
	if len(os.Args) <= 1 {
		return
	}

	words := os.Args[1]
	allPys := getPinyins(words)

	for _, pys := range allPys {
		logf("%s:\t%s\n", pys.char, pys.pinyins)
	}
}

太短了,连注释也懒得写了,[笑哭]

编译方式

直接 go build 就好了,也可以 go run main.go 直接运行,就一个文件。

使用方式

把所有待查询的汉字依次列在后面作为一个参数就好了,汉字之间不要空格。

比如下面这个:

bogon:py4zh tao$ ./py4zh 我人有的和主产不为这
2018/02/05 01:41:25 我: [wǒ]
2018/02/05 01:41:25 人: [rén]
2018/02/05 01:41:25 有: [yǒu yòu]
2018/02/05 01:41:25 的: [de dì dí dī]
2018/02/05 01:41:25 和: [hé hè huò huó hú]
2018/02/05 01:41:25 主: [zhǔ]
2018/02/05 01:41:25 产: [chǎn]
2018/02/05 01:41:25 不: [bù]
2018/02/05 01:41:25 为: [wéi wèi]
2018/02/05 01:41:25 这: [zhè zhèi]

注意到其中多音字也全部展示其拼音了。

再比如下面这个,在知乎上找的特别复杂的,哈哈哈哈:如何评价QQ的语音口令红包? - 他城旅人的回答 - 知乎

bogon:py4zh tao$ time ./py4zh 麤龗灪龖厵爨癵驫麣纞虋讟钃鸜麷鞻韽韾顟顠饙饙騳騱饐龗鱻爩麤灪爨癵籱麣纞钃鸜麷鞻鬰靊飝虪靐齉齾爩鱻爨癵籱饢驫麣纞虋讟钃鸜麷鞻韽韾顟顠饙饙騳騱饐靐齾龗鱻爩麤灪爨癵籱麣纞虋讟钃鸜麷鞻鬰靊讞鑱飝虪齺魕爧蠿齺
2018/02/05 01:39:24 麤: [cū]
2018/02/05 01:39:24 龗: [líng]
2018/02/05 01:39:24 灪: [yù]
2018/02/05 01:39:24 龖: [dá]
2018/02/05 01:39:24 厵: [yuán]
2018/02/05 01:39:24 爨: [cuàn]
2018/02/05 01:39:24 癵: [luán]
2018/02/05 01:39:24 驫: [biāo]
2018/02/05 01:39:24 麣: [yán]
2018/02/05 01:39:24 纞: [liàn]
2018/02/05 01:39:24 虋: [mén]
2018/02/05 01:39:24 讟: [dú]
2018/02/05 01:39:24 钃: [zhú]
2018/02/05 01:39:24 鸜: [qú]
2018/02/05 01:39:24 麷: [fēng]
2018/02/05 01:39:24 鞻: [lóu]
2018/02/05 01:39:24 韽: [ān]
2018/02/05 01:39:24 韾: [yīn]
2018/02/05 01:39:24 顟: [láo]
2018/02/05 01:39:24 顠: [piǎo]
2018/02/05 01:39:24 饙: [fēn]
2018/02/05 01:39:24 饙: [fēn]
2018/02/05 01:39:24 騳: [dú]
2018/02/05 01:39:24 騱: [xí]
2018/02/05 01:39:24 饐: [yì]
2018/02/05 01:39:24 龗: [líng]
2018/02/05 01:39:24 鱻: [xiān]
2018/02/05 01:39:24 爩: [yù]
2018/02/05 01:39:24 麤: [cū]
2018/02/05 01:39:24 灪: [yù]
2018/02/05 01:39:24 爨: [cuàn]
2018/02/05 01:39:24 癵: [luán]
2018/02/05 01:39:24 籱: [zhuó]
2018/02/05 01:39:24 麣: [yán]
2018/02/05 01:39:24 纞: [liàn]
2018/02/05 01:39:24 钃: [zhú]
2018/02/05 01:39:24 鸜: [qú]
2018/02/05 01:39:24 麷: [fēng]
2018/02/05 01:39:24 鞻: [lóu]
2018/02/05 01:39:24 鬰: [yù]
2018/02/05 01:39:24 靊: [fēng]
2018/02/05 01:39:24 飝: [fēi]
2018/02/05 01:39:24 虪: [shù]
2018/02/05 01:39:24 靐: [bìng]
2018/02/05 01:39:24 齉: [nàng]
2018/02/05 01:39:24 齾: [yà]
2018/02/05 01:39:24 爩: [yù]
2018/02/05 01:39:24 鱻: [xiān]
2018/02/05 01:39:24 爨: [cuàn]
2018/02/05 01:39:24 癵: [luán]
2018/02/05 01:39:24 籱: [zhuó]
2018/02/05 01:39:24 饢: [náng]
2018/02/05 01:39:24 驫: [biāo]
2018/02/05 01:39:24 麣: [yán]
2018/02/05 01:39:24 纞: [liàn]
2018/02/05 01:39:24 虋: [mén]
2018/02/05 01:39:24 讟: [dú]
2018/02/05 01:39:24 钃: [zhú]
2018/02/05 01:39:24 鸜: [qú]
2018/02/05 01:39:24 麷: [fēng]
2018/02/05 01:39:24 鞻: [lóu]
2018/02/05 01:39:24 韽: [ān]
2018/02/05 01:39:24 韾: [yīn]
2018/02/05 01:39:24 顟: [láo]
2018/02/05 01:39:24 顠: [piǎo]
2018/02/05 01:39:24 饙: [fēn]
2018/02/05 01:39:24 饙: [fēn]
2018/02/05 01:39:24 騳: [dú]
2018/02/05 01:39:24 騱: [xí]
2018/02/05 01:39:24 饐: [yì]
2018/02/05 01:39:24 靐: [bìng]
2018/02/05 01:39:24 齾: [yà]
2018/02/05 01:39:24 龗: [líng]
2018/02/05 01:39:24 鱻: [xiān]
2018/02/05 01:39:24 爩: [yù]
2018/02/05 01:39:24 麤: [cū]
2018/02/05 01:39:24 灪: [yù]
2018/02/05 01:39:24 爨: [cuàn]
2018/02/05 01:39:24 癵: [luán]
2018/02/05 01:39:24 籱: [zhuó]
2018/02/05 01:39:24 麣: [yán]
2018/02/05 01:39:24 纞: [liàn]
2018/02/05 01:39:24 虋: [mén]
2018/02/05 01:39:24 讟: [dú]
2018/02/05 01:39:24 钃: [zhú]
2018/02/05 01:39:24 鸜: [qú]
2018/02/05 01:39:24 麷: [fēng]
2018/02/05 01:39:24 鞻: [lóu]
2018/02/05 01:39:24 鬰: [yù]
2018/02/05 01:39:24 靊: [fēng]
2018/02/05 01:39:24 讞: [yàn]
2018/02/05 01:39:24 鑱: [chán]
2018/02/05 01:39:24 飝: [fēi]
2018/02/05 01:39:24 虪: [shù]
2018/02/05 01:39:24 齺: [zōu]
2018/02/05 01:39:24 魕: [jī]
2018/02/05 01:39:24 爧: [líng]
2018/02/05 01:39:24 蠿: [zhuó]
2018/02/05 01:39:24 齺: [zōu]

real    0m1.109s
user    0m0.236s
sys     0m0.077s

百度汉语还是挺厉害的,至少都认出来了,哈哈。

标签:我的小项目 · Go