(坑) Godot关于中文编码的研究

注意:这是我挖的坑,思考完成后填坑

在Crocoat中,希望给它做个对话功能,毕竟croc原本就带文本发送功能。这就涉及到Godot的编码问题,嗯,是问题。

crod send –code 123123 –text “好”

我接收到的是一个"濂"字加一个问号。

网上搜了一圈,也没见到解决方法。

收到的字符.to_utf8()后,显示:230 191 130 63
63就是个问号的ascii码。
这前三个ascii码就是"濂"字的UTF8编码,16进制E6BF82。
而这个"濂"字的GB2312编码为E5A5,10进制229 165。
而这个E5 A5 BD是"好"字的UTF8编码,它的GB2312为BAC3。
看起来怎么还丢掉了BD?

E6BF82 = E5A5 –> E5A5BD = BAC3

看起来把显示的汉字的UTF8编码作为GB2312编码接收了。

使用网上所说的chcp也不成功。

甚至用go作了服务程序,通过go来进行转换。

package main

import (
	"github.com/gin-gonic/gin"
	"github.com/gogf/gf/v2/encoding/gcharset"
)

// 返回字符GBK编码
func GetGBKCode(str string) (ret []byte) {
	str, err := gcharset.UTF8To("GBK", str)
	if err != nil {
		panic(err)
	}
	return []byte(str)
}

func main() {
	// tmp := GetGBKCode(src) // 通过现字符的GB2312编码,获取到原字符的UTF8编码

	r := gin.Default()
	r.Any("/:str", func(c *gin.Context) {
		str := c.Param("str")
		c.String(200, string(GetGBKCode(str)))
	})
	r.Run("0.0.0.0:8282")
}

但不知道为什么Http访问不成功,郁闷了。难道真的要内建对照表…


多次测试发现,凡是中文字数为奇数个时,因为接收只需要两位,而传送为三位,所以总会产生一个未知的“汉字”。产生的汉字 又不完整,所以接收时只能用?号代替,导致最后字符ascii总为63。

例如:
发送:你(C4E3/E4BDA0),接收:浣?(E4BD/E6B5A3+63)。即接收显示ascii码为 E6B5A33F(230, 181, 163, 63)。
发送:是(CAC7/E698AF),接收:鎛?(E698/E98F84+63)。即接收显示ascii码为 E98F843F(233, 143, 132, 63)。
发送:好(BAC3/E5A5BD),接收:濂?(E5A5/E6BF82+63)。即接收显示ascii码为 E6BF823F(230, 191, 130, 63)。

看起来不够一个汉字,就直接丢弃,换回一个问号。

发送2个汉字,就会接收到3个汉字。逆操作3个汉字,就可以得到原本发送的汉字。 如果是单数个汉字,就会造成以上那种丢失,而尾部附加?号的情况。
于是我发送时,主动生成偶数个汉字,利用没有“形象”或内容的汉字,凑成偶数个。 在解析的时候就正常了。

当然在命令行下没有按此规律发送,依然会存在解析不正确的情况。这似乎暂时解决不了。

相关文章