diff --git a/convertor/convertor.go b/convertor/convertor.go index 81f6920..6af5642 100644 --- a/convertor/convertor.go +++ b/convertor/convertor.go @@ -11,11 +11,15 @@ import ( "encoding/json" "errors" "fmt" + "io" "math" "reflect" "regexp" "strconv" "strings" + + "golang.org/x/text/encoding/simplifiedchinese" + "golang.org/x/text/transform" ) // ToBool convert string to a boolean @@ -374,3 +378,17 @@ func ToInterface(v reflect.Value) (value interface{}, ok bool) { return nil, false } } + +// Utf8ToGbk convert utf8 encoding data to GBK encoding data. +func Utf8ToGbk(bs []byte) ([]byte, error) { + r := transform.NewReader(bytes.NewReader(bs), simplifiedchinese.GBK.NewEncoder()) + b, err := io.ReadAll(r) + return b, err +} + +// GbkToUtf8 convert GBK encoding data to utf8 encoding data. +func GbkToUtf8(bs []byte) ([]byte, error) { + r := transform.NewReader(bytes.NewReader(bs), simplifiedchinese.GBK.NewDecoder()) + b, err := io.ReadAll(r) + return b, err +} diff --git a/convertor/convertor_test.go b/convertor/convertor_test.go index 91b6760..3a42e23 100644 --- a/convertor/convertor_test.go +++ b/convertor/convertor_test.go @@ -4,8 +4,10 @@ import ( "fmt" "reflect" "testing" + "unicode/utf8" "github.com/duke-git/lancet/internal" + "github.com/duke-git/lancet/validator" ) func TestToChar(t *testing.T) { @@ -339,3 +341,25 @@ func TestToInterface(t *testing.T) { assert.EqualValues(nil, nilVal) assert.Equal(false, ok) } + +func TestUtf8ToGbk(t *testing.T) { + assert := internal.NewAssert(t, "TestUtf8ToGbk") + + utf8Data := []byte("hello") + gbkData, err := Utf8ToGbk(utf8Data) + + assert.Equal(true, utf8.Valid(utf8Data)) + assert.Equal(true, validator.IsGBK(gbkData)) + assert.IsNil(err) +} + +func TestGbkToUtf8(t *testing.T) { + assert := internal.NewAssert(t, "TestGbkToUtf8") + + gbkData, err := Utf8ToGbk([]byte("hello")) + utf8Data, err := GbkToUtf8(gbkData) + + assert.IsNil(err) + assert.Equal(true, utf8.Valid(utf8Data)) + assert.Equal("hello", string(utf8Data)) +} diff --git a/docs/convertor.md b/docs/convertor.md index 5e9be22..565915f 100644 --- a/docs/convertor.md +++ b/docs/convertor.md @@ -38,6 +38,8 @@ import ( - [DeepClone](#DeepClone) - [CopyProperties](#CopyProperties) - [ToInterface](#ToInterface) +- [Utf8ToGbk](#Utf8ToGbk) +- [GbkToUtf8](#GbkToUtf8)
@@ -617,4 +619,71 @@ func main() { // abc // true } +``` + +### Utf8ToGbk + +

Converts utf8 encoding data to GBK encoding data.

+ +Signature: + +```go +func Utf8ToGbk(bs []byte) ([]byte, error) +``` + +Example: + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/convertor" + "github.com/duke-git/lancet/validator" +) + +func main() { + utf8Data := []byte("hello") + gbkData, _ := convertor.Utf8ToGbk(utf8Data) + + fmt.Println(utf8.Valid(utf8Data)) + fmt.Println(validator.IsGBK(gbkData)) + + // Output: + // true + // true +} +``` + +### GbkToUtf8 + +

Converts GBK encoding data to utf8 encoding data.

+ +Signature: + +```go +func GbkToUtf8(bs []byte) ([]byte, error) +``` + +Example: + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/convertor" +) + +func main() { + gbkData, _ := convertor.Utf8ToGbk([]byte("hello")) + utf8Data, _ := convertor.GbkToUtf8(gbkData) + + fmt.Println(utf8.Valid(utf8Data)) + fmt.Println(string(utf8Data)) + + // Output: + // true + // hello +} ``` \ No newline at end of file diff --git a/docs/convertor_zh-CN.md b/docs/convertor_zh-CN.md index afe15cf..0661461 100644 --- a/docs/convertor_zh-CN.md +++ b/docs/convertor_zh-CN.md @@ -38,6 +38,8 @@ import ( - [DeepClone](#DeepClone) - [CopyProperties](#CopyProperties) - [ToInterface](#ToInterface) +- [Utf8ToGbk](#Utf8ToGbk) +- [GbkToUtf8](#GbkToUtf8)
@@ -617,4 +619,71 @@ func main() { // abc // true } +``` + +### Utf8ToGbk + +

utf8编码转GBK编码。

+ +函数签名: + +```go +func Utf8ToGbk(bs []byte) ([]byte, error) +``` + +示例: + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/convertor" + "github.com/duke-git/lancet/validator" +) + +func main() { + utf8Data := []byte("hello") + gbkData, _ := convertor.Utf8ToGbk(utf8Data) + + fmt.Println(utf8.Valid(utf8Data)) + fmt.Println(validator.IsGBK(gbkData)) + + // Output: + // true + // true +} +``` + +### GbkToUtf8 + +

GBK编码转utf8编码。

+ +函数签名: + +```go +func GbkToUtf8(bs []byte) ([]byte, error) +``` + +示例: + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/convertor" +) + +func main() { + gbkData, _ := convertor.Utf8ToGbk([]byte("hello")) + utf8Data, _ := convertor.GbkToUtf8(gbkData) + + fmt.Println(utf8.Valid(utf8Data)) + fmt.Println(string(utf8Data)) + + // Output: + // true + // hello +} ``` \ No newline at end of file