Java 如何在golang中强制UTF-8编码

Java 如何在golang中强制UTF-8编码,java,json,go,Java,Json,Go,我试图将字符串解析为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中的常规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);

有什么想法吗?

根据Ecmascript的标准,控制字符必须转义才能成为有效的JSON。如果要保留控制字符,必须将它们转换为有效的转义字符串;如果不想保留它们,则必须在解组之前删除它们

下面是后者的一个实现:

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)
}

在操场上:

您需要将控制字符转换为unicode代码点,表示法为
\xyyy
,其中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)
}
其中:

{“os”:“09:@>A>DBWindows8.1\u001A>@?>@0B82=0O”}
错误:
{09:@>A>DB Windows 8.1>@?>@0B82=0O}

在这里,
\u
一旦打印出来就会消失,但当您试图用其中一个字符解析JSON时,它会导致问题,您可能需要清理输入。这可能有助于:
{"os": "09:@>A>DB Windows 8.1 \u001A>@?>@0B82=0O"}
error: <nil>
{09:@>A>DB Windows 8.1 >@?>@0B82=0O}