GoLang печатает эмодзи из литерала Юникод, загруженного из файла - PullRequest
1 голос
/ 16 апреля 2019

Я пытаюсь напечатать символы смайликов Юникода, загруженные из файла JSON, используя GoLang.Когда я загружаю и удаляю файл, поле структуры, переданное fmt.Println, печатает только экранированную последовательность строк.Например, одна строка сохраняется в файле как {..."Unicode":"\\U0001f47f"}, и при ее печати получается \U0001f417, а не символ эмодзи.Вызов fmt.Printf("%q", str) дает \\U0001f417.Я не смог найти решение, и я немного озадачен.Я попытался удалить escape-последовательность и объединить ее в шаблонной строке, но это никак не повлияло.Я также пытался использовать строковый буфер, но он тоже не работал.Любой совет очень ценится!

Ответы [ 2 ]

4 голосов
/ 16 апреля 2019

Используйте следующую функцию для преобразования руны, указанной в формате \Uxxxxxxxx, в фактическую руну:

func unquoteCodePoint(s string) (rune, error) {
    // 16 specifies hex encoding
    // 32 is size in bits of the rune type
    r, err := strconv.ParseInt(strings.TrimPrefix(s, "\\U"), 16, 32)
    return rune(r), err
}

Вариант - преобразовать в строку вместо руны:

func unquoteCodePoint(s string) (string, error) {
    r, err := strconv.ParseInt(strings.TrimPrefix(s, "\\U"), 16, 32)
    return string(r), err
}

Используйте строковую версию следующим образом:

s, err := unquoteCodePoint("\\U0001f47f")
if err != nil {
    // handle error
}
fmt.Printf("%s\n", s) // prints  ?
3 голосов
/ 16 апреля 2019

Ты можешь сделать это? https://play.golang.org/p/4mFQfyqeAXN

package main

import (
    "fmt"
    "html"
    "strconv"
    "strings"
)

func main() {
    xx := "\\U0001f47f"

    // Hex String
    h := strings.ReplaceAll(xx, "\\U", "0x")

    // Hex to Int
    i, _ := strconv.ParseInt(h, 0, 64)

    // Unescape the string (HTML Entity -> String).
    str := html.UnescapeString(string(i))

    // Display the emoji.
    fmt.Println(str)
}
...