在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
,因为它为我指明了一个临时解决方案。