关于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)
}