Преобразование вывода командной строки с байтовой строкой UTF-8 в кодовую точку Unicode в Go

Я запускаю исполняемый файл из Go через os.Exec, что дает мне следующий результат: (\\xe2\\x96\\xb2). Вывод содержит строку байтов UTF-8, которую я хочу преобразовать в соответствующую кодовую точку Unicode (U+25B2). То, что я ожидаю увидеть или пытаюсь преобразовать, это: «(▲)». Я просмотрел эту запись в блоге Go (https://blog.golang.org/strings), но она начинается с интерпретируемого строкового литерала, тогда как вывод команды кажется необработанным строковым литералом. Я пробовал strconv.Quote и strconv.Unquote, но это не дает того, что я ищу.

Можете ли вы показать пример того, что вы пытаетесь сделать? Так как go использует utf8 для строк, он по умолчанию правильно интерпретирует байты: play.golang.org/p/u3JkywATmPR

JimB 10.04.2019 20:26

Возможно, я недостаточно ясно выразился в приведенном выше описании. Выходная строка, которую я получаю, не интерпретируется автоматически, потому что она ведет себя как необработанный строковый литерал. См. здесь: play.golang.org/p/TI-41dEWZaM

matzewagner 10.04.2019 22:55
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
1
2
506
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать пакет strconv для разбора строкового литерала, содержащего escape-последовательности.

Быстрый и грязный способ — просто добавить недостающие кавычки и интерпретировать их как строку в кавычках, используя strconv.Unquote.

s := `\xe2\x96\xb2`
s, err := strconv.Unquote(`"` + s + `"`)

Вы также можете напрямую анализировать строку по одному символу за раз (что Unquote делает внутри), используя strconv.UnquoteChar

s := `\xe2\x96\xb2`
buf := make([]byte, 0, 3*len(s)/2)
for len(s) > 0 {
    c, _, ss, err := strconv.UnquoteChar(s, 0)
    if err != nil {
        log.Fatal(err)
    }
    s = ss
    buf = append(buf, byte(c))
}
s = string(buf)

https://play.golang.org/p/6SDij9d-aRr

Другие вопросы по теме