Golang конвертировать iso8859-1 в utf8
Я пытаюсь преобразовать кодированную строку ISO 8859-1 в UTF-8.
Следующая функция работает с моими testdata, которые содержат немецкие умлауты, но я не совсем уверен, что источник, кодирующий руну (б), принимает предположения. Принимает ли он какую-то кодировку по умолчанию, например. ISO8859-1 или есть ли способ сказать, какую кодировку использовать?
func toUtf8(iso8859_1_buf []byte) string {
var buf = bytes.NewBuffer(make([]byte, len(iso8859_1_buf)*4))
for _, b := range(iso8859_1_buf) {
r := rune(b)
buf.WriteRune(r)
}
return string(buf.Bytes())
}
Ответы
Ответ 1
rune - это псевдоним для int32, и когда дело доходит до кодирования, предполагается, что руна имеет значение символа Unicode (кодовая точка). Значением b
в rune(b)
должно быть значение unicode. Для 0x00 - 0xFF это значение идентично латинскому-1, поэтому вам не о чем беспокоиться.
Затем вам нужно закодировать руны в UTF8. Но это кодирование выполняется просто путем преобразования []rune
в string
.
Это пример вашей функции без использования пакета байтов:
func toUtf8(iso8859_1_buf []byte) string {
buf := make([]rune, len(iso8859_1_buf))
for i, b := range iso8859_1_buf {
buf[i] = rune(b)
}
return string(buf)
}
Ответ 2
Эффект
r := rune(expression)
является:
- Объявить переменную
r
с типом rune
(псевдоним для int32).
- Инициализировать переменную
r
со значением expresion.
Не используется кодировка No (re) и указание того, какой из них необязательно использовать, возможно только путем явной записи/обработки некоторого повторного кодирования в коде. К счастью, в этом случае не требуется (повторная) кодировка, Unicode вводит эти коды ISO 8859-1 сопоставимым образом как ASCII. (Если я правильно проверил здесь)