【问题标题】:How to force UTF-8 encoding in golang如何在 golang 中强制使用 UTF-8 编码
【发布时间】:2016-02-19 23:35:40
【问题描述】:

我正在尝试将字符串解析为 golang 中的常规 JSON 结构。我不控制原始字符串,但它可能包含像这样不需要的字符

originalstring := `{"os": "\u001C09:@>A>DB Windows 8.1 \u001A>@?>@0B82=0O"}`
input := []byte(originalstring)
var event JsonStruct
parsingError := json.Unmarshal(input, &event)

如果我尝试将其解析为 golang,我会收到此错误

 invalid character '\x1c' in string literal

我以前有办法在 Java 中这样做

event = charset.decode(charset.encode(event)).toString();
eventJSON = new JsonObject(event);

有什么想法吗?

【问题讨论】:

标签: java json go


【解决方案1】:

您需要将控制字符转换为符号 \xYYYY 中的 unicode 代码点,其中 Y 是十六进制数字。一个可行的例子是:

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "unicode"
)

func convert(input string) string {
    var buf bytes.Buffer
    for _, r := range input {
        if unicode.IsControl(r) {
            fmt.Fprintf(&buf, "\\u%04X", r)
        } else {
            fmt.Fprintf(&buf, "%c", r)
        }
    }
    return buf.String()
}

func main() {    
    input := convert(`{"os": "09:@>A>DB Windows 8.1 >@?>@0B82=0O"}`)
    fmt.Println(input)
    js := []byte(input)

    t := struct {
        OS string
    }{}

    err := json.Unmarshal(js, &t)
    fmt.Println("error:", err)
    fmt.Println(t)
}

哪个produces:

{"os": "09:@>A>DB Windows 8.1 \u001A>@?>@0B82=0O"}
error: <nil>
{09:@>A>DB Windows 8.1 >@?>@0B82=0O}

【讨论】:

    【解决方案2】:

    根据JSON strings 的 Ecmascript 标准,必须对控制字符进行转义才能成为有效的 JSON。如果您想保留控制字符,则必须将它们转换为有效的转义字符串,或者如果您不想保留它们,则必须在 Unmarshaling 之前将其删除。

    这是后者的一个实现:

    func stripCtlFromUTF8(str string) string {
        return strings.Map(func(r rune) rune {
            if r >= 32 && r != 127 {
                return r
            }
            return -1
        }, str)
    }
    
    func main() {
    
        js := []byte(stripCtlFromUTF8(`{"os": "09:@>A>DB Windows 8.1 >@?>@0B82=0O"}`))
    
        t := struct {
            OS string
        }{}
    
        err := json.Unmarshal(js, &t)
        fmt.Println("error:", err)
        fmt.Println(t)
    }
    

    在操场上:http://play.golang.org/p/QRtkS8LF1z

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-10
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-21
      相关资源
      最近更新 更多