qiniu / iconv

Golang bindings to libiconv - Convert string to requested character encoding

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

关于ConvString结果出错以及outbuf [512]byte的疑惑

crazyvv opened this issue · comments

在使用ConvString时发现一个问题,当s的长度过长后,转换的结果与预期不符,转换后的字符串的后半段发生了与前半段重复的情况
如原字符串为

......
A
B
C
D
E
F

转换后成了

........
A
B
C
B
C
B
C

看了下源代码

func (cd Iconv) ConvString(s string) string {
	var outbuf [512]byte
	if s1, _, err := cd.Conv([]byte(s), outbuf[:]); err != nil {
		return ""
	} else {
		return string(s1)
	}
}

这里的变量是var outbuf [512]byte,不知道为什么是512呢?
个人觉得

var outbuf []byte
length := bytes.Count([]byte(s), nil)
outbuf = make([]byte, length)

这样应该更好啊。。
对golang以及这里的出发点都不太熟悉。还请大家指导!

因为不能通过&获取一个切片的实际数据的地址:
也就是:

// p1 指向 data1 的第一个元素的地址
var data1 [512]byte
p1 := &data1

// p2指向data2切片结构体的地址
data2 := make([]byte,512)
p2 := &data2

无法把这个p2作为参数调用c里的函数。

另外,无法在转换前知晓转换后的字符串有多长。

=-=
go要定义一个编译时不知长度的数组可以这么搞:

//#include <stdlib.h>
import "C"

arr := C.malloc(n)

跑路……

我也遇到这个问题了。

我的解决方案:

import 	"io/ioutil"
import "golang.org/x/net/html/charset"

func convrtToUTF(str string, origEncoding string) string {
    strBytes := []byte(str)
    byteReader := bytes.NewReader(strBytes)
    reader, _ := charset.NewReaderLabel(origEncoding, byteReader)
    strBytes, _ = ioutil.ReadAll(reader)
    return string(strBytes)
}