Подтвердить что ты не робот

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())
}
4b9b3361

Ответ 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. (Если я правильно проверил здесь)