在Go中输出不带引号的Unicode
我正在使用在Go中输出不带引号的Unicode,unicode,go,Unicode,Go,我正在使用goyaml作为YAML美容器。通过加载和转储YAML文件,我可以对其进行源代码格式化。我将YAML源文件中的数据解组到结构中,封送那些字节,然后将字节写入输出文件。但是这个过程将我的Unicode字符串变形为引用字符串的文本版本,我不知道如何反转它 示例输入副标题.yaml: line: 你好 line: "\u4F60\u597D" line: "你好" 我已经把所有问题都归结到最小的可重复性问题上。下面是代码,使用\uu捕获不会弹出的错误: package main
goyaml
作为YAML美容器。通过加载和转储YAML文件,我可以对其进行源代码格式化。我将YAML源文件中的数据解组到结构中,封送那些字节,然后将字节写入输出文件。但是这个过程将我的Unicode字符串变形为引用字符串的文本版本,我不知道如何反转它
示例输入副标题.yaml
:
line: 你好
line: "\u4F60\u597D"
line: "你好"
我已经把所有问题都归结到最小的可重复性问题上。下面是代码,使用\uu
捕获不会弹出的错误:
package main
import (
"io/ioutil"
//"unicode/utf8"
//"fmt"
"gopkg.in/yaml.v1"
)
type Subtitle struct {
Line string
}
func main() {
filename := "subtitle.yaml"
in, _ := ioutil.ReadFile(filename)
var subtitle Subtitle
_ = goyaml.Unmarshal(in, &subtitle)
out, _ := goyaml.Marshal(&subtitle)
//for len(out) > 0 { // For debugging, see what the runes are
// r, size := utf8.DecodeRune(out)
// fmt.Printf("%c ", r)
// out = out[size:]
//}
_ = ioutil.WriteFile(filename, out, 0644)
}
实际输出副标题.yaml
:
line: 你好
line: "\u4F60\u597D"
line: "你好"
在我得到变量后,我想逆转goyaml
中的奇怪
注释掉的符文打印代码块为清晰起见在符文之间添加空格,输出以下内容。它显示Unicode符文像你代码>未被解码,但按字面意思处理:
l i n e : " \ u 4 F 6 0 \ u 5 9 7 D "
在将其写入输出文件之前,如何将其解压缩,使输出看起来像输入(尽管经过美化)
所需输出副标题.yaml
:
line: 你好
line: "\u4F60\u597D"
line: "你好"
临时解决方案
我已经存档了。与此同时,@bobince关于yaml\u emitter\u set\u unicode
的提示有助于解决这个问题。它被定义为一个C绑定,但从未被调用(或被赋予设置它的选项)!我更改了encode.go
并添加了代码,一切正常。最好将其设置为可选,但这需要更改封送处理API。也有类似的问题,可以应用它来规避goyaml.Marshal()中的错误。(*Regexp)ReplaceAllFunc是您的朋友,您可以使用它来扩展字节数组中转义的Unicode符文。对于生产来说可能有点太脏了,但对于示例来说是有效的;-)
这方面有什么进展吗?我想goyeml软件包有点问题。这并不奇怪,”你好"代码>与“\u4F60\u597D相同“
对于YAML解析器,goyaml从未承诺给您特定的序列化。您有时可能会选择\u
转义版本,这是有充分理由的。你是否得到了一个<代码> yAMLL EmithTysSuxUnOdio方法来选择GYAML中的行为和其他的YAML库?当然有原因,但是如果输出不像我的输入,我会觉得奇怪。感谢您提到yaml\u emitter\u set\u unicode
,因为它为我指明了一个临时解决方案。