Java 如何在golang中强制UTF-8编码
我试图将字符串解析为golang中的常规JSON结构。我不控制原始字符串,但它可能包含这样不需要的字符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) 如果我试着
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}