Цепной вызов GO для написания библиотеки транскодирования

задняя часть Go GitHub рептилия

Два дня назад я пошел пойти, чтобы написать гусеничное веб-сайт, но контент, который я поднялся вниз, был искажен. Оказывается, на веб-сайте есть кодировка GBK, и кодировка по умолчанию в GO - UTF-8, так что это приведет к не-UTF-8. Содержание искажено.

Так что я пошел, чтобы найти банк транскодов Go, в основномmahonia,iconv-go, а официальныйgolang.org/x/textЭти три библиотеки используются чаще.

Я использовал эти три библиотеки некоторое время и обнаружил, что они не очень довольны. Давайте посмотрим на преобразование GBK в UTF-8 этих трех библиотек.

  • mahonia
package main

import "fmt"
import "github.com/axgle/mahonia"

func main() {
	testBytes := []byte{0xC4, 0xE3, 0xBA, 0xC3, 0xA3, 0xAC, 0xCA, 0xC0, 0xBD, 0xE7, 0xA3, 0xA1}
	testStr := string(testBytes)
	enc := mahonia.NewDecoder("gbk")
	res := enc.ConvertString(testStr)
	fmt.Println(res) // 你好,世界!
}
  • iconv-go
package main

import (
	"fmt"

	"github.com/axgle/mahonia"
	iconv "github.com/djimenez/iconv-go"
)

func main() {
	testBytes := []byte{0xC4, 0xE3, 0xBA, 0xC3, 0xA3, 0xAC, 0xCA, 0xC0, 0xBD, 0xE7, 0xA3, 0xA1}
	var res []byte
	iconv.Convert(testBytes, res, "GBK", "UTF-8")
	fmt.Printf(string(res)) // 你好,世界!
}
  • golang.org/x/text
package main

import (
	"bytes"
	"fmt"
	"io/ioutil"

	"golang.org/x/text/encoding/simplifiedchinese"
	"golang.org/x/text/transform"
)

func main() {
	testBytes := []byte{0xC4, 0xE3, 0xBA, 0xC3, 0xA3, 0xAC, 0xCA, 0xC0, 0xBD, 0xE7, 0xA3, 0xA1}
	decoder := simplifiedchinese.GBK.NewDecoder()
	reader := transform.NewReader(bytes.NewReader(testBytes), decoder)
	res, _ := ioutil.ReadAll(reader)
	fmt.Printf(string(res)) // 你好,世界!
}

Выше приведено основное использование этих трех библиотек.Можно обнаружить, что у этих трех библиотек есть некоторые проблемы:

  • API Mahonia самый простой, но он только вводит и выводит.stringзначение типа, а с данными в GO мы имеем дело много раз[]byteилиio.Readerтип, это более ограничено.
  • iconv-go может читатьstring,[]byteиio.ReaderТип данных, но нижний уровень - это инкапсуляция библиотеки iconv C. Будут проблемы в различных средах, и ошибки во время компиляции нелегко найти. Я не мог установить его несколько раз раньше :(.
  • Golang.org/x/text Это официальная библиотека, но API слишком сложный, проходит.

transcode

Я подумал об этом некоторое время и решил, что цепные вызовы будут хорошим решением, поэтому я построил колесо под названиемtranscode, давайте посмотрим, как его использовать:

  • ГБК в UTF-8
package main

import (
	"fmt"

	"github.com/piex/transcode"
)

func main() {
	testBytes := []byte{0xC4, 0xE3, 0xBA, 0xC3, 0xA3, 0xAC, 0xCA, 0xC0, 0xBD, 0xE7, 0xA3, 0xA1}
	res := transcode.FromByteArray(testBytes).Decode("GBK").ToString()
	fmt.Printf(res) // 你好,世界
}
  • UTF-8 в ГБК
package main

import (
	"bytes"
	"fmt"

	"github.com/piex/transcode"
)

func main() {
	testBytes := []byte{0xC4, 0xE3, 0xBA, 0xC3, 0xA3, 0xAC, 0xCA, 0xC0, 0xBD, 0xE7, 0xA3, 0xA1}
	testStr := "你好,世界!"
	res := transcode.FromString(testStr).Encode("GBK").ToByteArray()
	fmt.Println(bytes.Equal(res, testBytes)) // true
}

Нижний слой этой библиотеки представляет собой инкапсуляцию API, связанного с транскодированием golang.org/x/text. Это официальная библиотека, и она достойна признания. API знаний слишком сложен в использовании, поэтому эта библиотека инкапсулирована. и в настоящее время поддерживаетstringи[]byteВвод и вывод типов данных.

Здесь используется цепочка вызовов, в основном есть возможность вернуть структуру. тогда правильноToStringиToByteArrayЭти два метода выполняют дополнительную обработку.

Адрес склада:GitHub.com/leave/натуральный камень…, вы можете взглянуть на исходный код, он все еще очень прост и будет добавлен позжеio.ReaderТипа поддержка, желающие могут пр.