mirror of
https://github.com/fumiama/emozi.git
synced 2026-06-05 00:32:48 +08:00
fix(校验): RTL 不可见字符引起的显示问题
This commit is contained in:
34
README.md
34
README.md
@@ -14,7 +14,7 @@
|
|||||||
## 命令行工具
|
## 命令行工具
|
||||||
位于`cmd`文件夹。
|
位于`cmd`文件夹。
|
||||||
```bash
|
```bash
|
||||||
用法: [-h|f|nr] [-db 字.db] [-d 🌹😺🐴👩] [-e 好] 形声字选择1 形声字选择2 ...
|
用法: [-h|f|nr] [-db 字.db] [-d 🌹🐱🐴👩] [-e 好] 形声字选择1 形声字选择2 ...
|
||||||
-a string
|
-a string
|
||||||
添加一个汉字到附加库
|
添加一个汉字到附加库
|
||||||
-d string
|
-d string
|
||||||
@@ -47,6 +47,7 @@
|
|||||||
```bash
|
```bash
|
||||||
go run cmd/main.go -i -a 哦 -p o
|
go run cmd/main.go -i -a 哦 -p o
|
||||||
文字: 哦 拼音IPA: 0 ɔ 轻声 ID: 93346820784388
|
文字: 哦 拼音IPA: 0 ɔ 轻声 ID: 93346820784388
|
||||||
|
程序处理结束
|
||||||
```
|
```
|
||||||
### 查询库中记录的字的信息
|
### 查询库中记录的字的信息
|
||||||
```bash
|
```bash
|
||||||
@@ -54,38 +55,53 @@ go run cmd/main.go -a 行
|
|||||||
查询到汉字 行 的记录:
|
查询到汉字 行 的记录:
|
||||||
0) #149859999752449 行 [ɕiŋ阳平] 从行 xing xínɡ
|
0) #149859999752449 行 [ɕiŋ阳平] 从行 xing xínɡ
|
||||||
1) #149859999554817 行 [xɑŋ阳平] 从行 hang háng
|
1) #149859999554817 行 [xɑŋ阳平] 从行 hang háng
|
||||||
|
程序处理结束
|
||||||
```
|
```
|
||||||
### 编码
|
### 编码
|
||||||
> 注意: 可以指定`-nr`参数从而使编解码结果唯一。
|
> 注意: 可以指定`-nr`参数从而使编解码结果唯一。
|
||||||
```bash
|
```bash
|
||||||
go run cmd/main.go -e 好
|
go run cmd/main.go -e 好
|
||||||
编码结果: 🌹😺🐴👩
|
编码结果: 🌹🐱🐴👩
|
||||||
|
程序处理结束
|
||||||
```
|
```
|
||||||
### 解码
|
### 解码
|
||||||
```bash
|
```bash
|
||||||
go run cmd/main.go -d 🌹😺🐴👩
|
go run cmd/main.go -d 🌹🐱🐴👩
|
||||||
解码结果: 好
|
解码结果: 好
|
||||||
|
程序处理结束
|
||||||
```
|
```
|
||||||
### 添加一个字到附加库
|
### 添加一个字到附加库
|
||||||
```bash
|
```bash
|
||||||
go run cmd/main.go -e 的
|
go run cmd/main.go -e 的
|
||||||
编码结果: 的🈳🈳🈳
|
编码结果: 的🈳🈳🈳
|
||||||
|
程序处理结束
|
||||||
|
|
||||||
go run cmd/main.go -a 的 -p de -r 日 -re 🌞
|
go run cmd/main.go -a 的 -p de -r 日 -re 🌞
|
||||||
已添加汉字: 的 读音: t, ɤ, 轻声 部首: 日 ID: 130309308023300
|
已添加汉字: 的 读音: t, ɤ, 轻声 部首: 日 ID: 130309308023300
|
||||||
已添加部首: 日 颜文字: 🌞
|
已添加部首: 日 颜文字: 🌞
|
||||||
go run cmd/main.go -e 的
|
查询到汉字 的 的记录:
|
||||||
编码结果: 🔪😋😯🌞
|
0) #130309308023300 的 [tɤ轻声] 从日 de de
|
||||||
|
程序处理结束
|
||||||
|
|
||||||
|
go run cmd/main.go -e 的
|
||||||
|
编码结果: 🔪😋😯🌞
|
||||||
|
程序处理结束
|
||||||
```
|
```
|
||||||
### 指定多音字
|
### 指定多音字
|
||||||
```bash
|
```bash
|
||||||
go run cmd/main.go -e 你好,世界!看看多音字:行。
|
go run cmd/main.go -e 你好,世界!看看多音字:行。
|
||||||
编码结果: 🥛👔🐴👤🐒🐱🐎👩,🌴☀️😨🌍➖✌️😨👨🌾!👖🔐🍉👁️😭🔐🍉👁️🕳️🌀🍉🪩🧂🎵🍉🎵⬅️☀️😨🚼:[🌟🦅🦎⛕|🌷👍🦎⛕]。
|
编码结果: 🥛👔🐴👤🌸🐱🐴👩,📙☀️😨🌍🦶👴😨👨🌾!👖🔐🍉👁️😭🔐🍉👁️🫘🌀🍉🪩💊🎵🍉🎵⬅🌅😨🚼:[✨🦅🧗♂️⛕|🐵👍🧗♂️⛕]。
|
||||||
可选形声: [2]
|
可选形声: [2]
|
||||||
在参数中指定形声字编号(从0开始)以生成不带中括号的编码结果
|
在参数中指定形声字编号(从0开始)以生成不带中括号的编码结果
|
||||||
|
程序处理结束
|
||||||
|
|
||||||
go run cmd/main.go -e 你好,世界!看看多音字:行。 1
|
go run cmd/main.go -e 你好,世界!看看多音字:行。 1
|
||||||
编码结果: 🥛👔🐴👤🐵🐈⬛🐎👩,🪸☀️😨🌍🐓✌️😨👨🌾!👖🔐🍉👁️😭🔐🍉👁️🪔🌀🍉🪩💊🎵🍉🎵👈🌅😨🚼:🐅👍🧗♂️⛕。
|
编码结果: 🥛👔🐴👤🌼😺🐴👩,🏔️🌅😨🌍➖👴😨👨🌾!👖🔐🍉👁️👖🔐🍉👁️🔪🌀🍉🪩🦷🎵🍉🎵⬅☀️😨🚼:🔥👍🧗⛕。
|
||||||
go run cmd/main.go -d 🥛👔🐴👤🐵🐈⬛🐎👩,🪸☀️😨🌍🐓✌️😨👨🌾!👖🔐🍉👁️😭🔐🍉👁️🪔🌀🍉🪩💊🎵🍉🎵👈🌅😨🚼:🐅👍🧗♂️⛕。
|
程序处理结束
|
||||||
|
|
||||||
|
go run cmd/main.go -d "🥛👔🐴👤🌼😺🐴👩,🏔️🌅😨🌍➖👴😨👨🌾!👖🔐🍉👁️👖🔐🍉👁️🔪🌀🍉🪩🦷🎵🍉🎵⬅☀️😨🚼:🔥👍🧗⛕。"
|
||||||
解码结果: [你|儗]好,世[界|畍]!看看多音字:行。
|
解码结果: [你|儗]好,世[界|畍]!看看多音字:行。
|
||||||
|
程序处理结束
|
||||||
```
|
```
|
||||||
|
|
||||||
## 实用工具
|
## 实用工具
|
||||||
|
|||||||
@@ -132,7 +132,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
fmt.Println("已删除汉字ID:", *deloverlay)
|
fmt.Println("已删除汉字ID:", *deloverlay)
|
||||||
}
|
}
|
||||||
if *addoverlay != "" {
|
if *addoverlay != "" && !*getglobalid {
|
||||||
r := []rune(*addoverlay)
|
r := []rune(*addoverlay)
|
||||||
if len(r) != 1 {
|
if len(r) != 1 {
|
||||||
fmt.Println("ERROR: 非法汉字参数-a:", *addoverlay)
|
fmt.Println("ERROR: 非法汉字参数-a:", *addoverlay)
|
||||||
|
|||||||
@@ -14,8 +14,7 @@ func TestEncode(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
t.Log(es.String(), lst)
|
if es.String() != "🥛👔🐴👤🌹🐱🐴👩,💦🌞😨🌍➕👴😨👨🌾!😭🔐🍉👁️😭🔐🍉👁️🔪🌀🍉🪩🐑🎵🍉🎵👈🌞😨🚼:[👇🦅🧗⛕|🌹👍🧗⛕]。" {
|
||||||
if es.String() != "🥛👔🐴👤🌹🐱🐴👩,💦🌞😨🌍➕✌😨👨🌾!😭🔐🍉👁️😭🔐🍉👁️🔪🌀🍉🪩🐑🎵🍉🎵👈🌞😨🚼:[👇🦅🧗⛕|🌹👍🧗⛕]。" {
|
|
||||||
t.Fatal("got", es.String())
|
t.Fatal("got", es.String())
|
||||||
}
|
}
|
||||||
if len(lst) != 1 && lst[0] != 2 {
|
if len(lst) != 1 && lst[0] != 2 {
|
||||||
@@ -25,18 +24,16 @@ func TestEncode(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
t.Log(es.String(), lst)
|
if es.String() != "🥛👔🐴👤🌹🐱🐴👩,💦🌞😨🌍➕👴😨👨🌾!🐽🌞🐴✋🔪🦅😨🏠🔪🌀🍉🪩🐑🎵🍉🎵👈🌞😨🚼:🐑🎵🧗💰🌹👍🧗⛕👇🦅🧗⛕。" {
|
||||||
if es.String() != "🥛👔🐴👤🌹🐱🐴👩,💦🌞😨🌍➕✌😨👨🌾!🐽🌞🐴✋🔪🦅😨🏠🔪🌀🍉🪩🐑🎵🍉🎵👈🌞😨🚼:🐑🎵🧗💰🌹👍🧗⛕👇🦅🧗⛕。" {
|
|
||||||
t.Fatal("got", es.String())
|
t.Fatal("got", es.String())
|
||||||
}
|
}
|
||||||
if len(lst) != 2 && lst[0] != 2 && lst[1] != 2 {
|
if len(lst) != 2 && lst[0] != 2 && lst[1] != 2 {
|
||||||
t.Fail()
|
t.Fail()
|
||||||
}
|
}
|
||||||
es, lst, err = c.Encode(false, "的")
|
es, _, err = c.Encode(false, "的")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
t.Log(es.String(), lst)
|
|
||||||
if es.String() != "的🈳🈳🈳" {
|
if es.String() != "的🈳🈳🈳" {
|
||||||
t.Fatal("got", es.String())
|
t.Fatal("got", es.String())
|
||||||
}
|
}
|
||||||
@@ -48,52 +45,44 @@ func TestDecode(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
s := "你好,世界!看看多音字:行。"
|
s := "你好,世界!看看多音字:行。"
|
||||||
es, lst, err := c.Encode(false, s)
|
es, _, err := c.Encode(false, s)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
t.Log(es.String(), lst)
|
|
||||||
ds, err := c.Decode(es, false)
|
ds, err := c.Decode(es, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
t.Log(ds)
|
|
||||||
if ds != "[你|儗]好,世[界|畍]!看看多音字:[行|行]。" {
|
if ds != "[你|儗]好,世[界|畍]!看看多音字:[行|行]。" {
|
||||||
t.Fatal("got", ds)
|
t.Fatal("got", ds)
|
||||||
}
|
}
|
||||||
es, lst, err = c.Encode(false, "你好,世界!指定多音字:银行行。", 1, 0)
|
es, _, err = c.Encode(false, "你好,世界!指定多音字:银行行。", 1, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
t.Log(es.String(), lst)
|
|
||||||
ds, err = c.Decode(es, false)
|
ds, err = c.Decode(es, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
t.Log(ds)
|
|
||||||
if ds != "[你|儗]好,世[界|畍]![指|抧|扺]定多音字:[銀|银]行行。" {
|
if ds != "[你|儗]好,世[界|畍]![指|抧|扺]定多音字:[銀|银]行行。" {
|
||||||
t.Fatal("got", ds)
|
t.Fatal("got", ds)
|
||||||
}
|
}
|
||||||
es, lst, err = c.Encode(false, "好啊")
|
es, _, err = c.Encode(false, "好啊")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
t.Log(es.String(), lst)
|
|
||||||
ds, err = c.Decode(es, false)
|
ds, err = c.Decode(es, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
t.Log(ds)
|
|
||||||
if ds != "好啊" {
|
if ds != "好啊" {
|
||||||
t.Fatal("got", ds)
|
t.Fatal("got", ds)
|
||||||
}
|
}
|
||||||
es = EmoziString("🌹😺🐴👩") // nolint: go-staticcheck
|
es = EmoziString("🌹🐱🐴👩") // nolint: go-staticcheck
|
||||||
t.Log(es.String())
|
|
||||||
ds, err = c.Decode(es, false)
|
ds, err = c.Decode(es, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
t.Log(ds)
|
|
||||||
if ds != "好" {
|
if ds != "好" {
|
||||||
t.Fatal("got", ds)
|
t.Fatal("got", ds)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -210,14 +210,14 @@ var 逆声调 = 逆初始化[声调枚举](声调[:], 4)
|
|||||||
//
|
//
|
||||||
// 具体做法是先对后面的文本做crc32然后取 校验表长度^校验字节数 的模
|
// 具体做法是先对后面的文本做crc32然后取 校验表长度^校验字节数 的模
|
||||||
var 校验表 = func() []rune {
|
var 校验表 = func() []rune {
|
||||||
x, err := base14.UTF16BE2UTF8(base14.StringToBytes("\x20\x0b\x20\x0c\x20\x0d\x20\x0e\x20\x0f\x20\x2a\x20\x2b\x20\x2c\x20\x2d\x20\x2e\x20\x60\x20\x61\x20\x62\x20\x63\x20\x64\x20\x65\x20\x66\x20\x68\x20\x69\x20\x6a\x20\x6b\x20\x6c\x20\x6d\x20\x6e\x20\x6f"))
|
x, err := base14.UTF16BE2UTF8(base14.StringToBytes("\x20\x0b\x20\x0c\x20\x0d\x20\x0e\x20\x2a\x20\x2c\x20\x2d\x20\x60\x20\x61\x20\x62\x20\x63\x20\x64\x20\x65\x20\x66\x20\x68\x20\x69\x20\x6a\x20\x6b\x20\x6c\x20\x6d\x20\x6e\x20\x6f"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
return []rune(base14.BytesToString(x))
|
return []rune(base14.BytesToString(x))
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// 校验表长度 25
|
// 校验表长度 22
|
||||||
var 校验表长度 = len(校验表)
|
var 校验表长度 = len(校验表)
|
||||||
|
|
||||||
// 校验字节数 默认为 3, 不得大于 3
|
// 校验字节数 默认为 3, 不得大于 3
|
||||||
|
|||||||
Reference in New Issue
Block a user