import "C" 要什么环境要求

lauking · 2014-03-04 07:40:33 · 4136 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2014-03-04 07:40:33 的主题,其中的信息可能已经有所发展或是发生改变。

今天看到七牛使用的字符转化的代码文件:https://github.com/qiniu/iconv/blob/develop/iconv.go ,代码如下:

//
// iconv.go
//
 package iconv

 // #cgo darwin LDFLAGS: -liconv
 // #include <iconv.h>
// #include <stdlib.h>
// #include <errno.h>
import "C"

import (
"io"
"unsafe"
"bytes"
"syscall"
  )

var EILSEQ = syscall.Errno(C.EILSEQ)
var E2BIG = syscall.Errno(C.E2BIG)

const DefaultBufSize = 4096

type Iconv struct {
Handle C.iconv_t
}

 func Open(tocode string, fromcode string) (cd Iconv, err error) {

tocode1 := C.CString(tocode)
defer C.free(unsafe.Pointer(tocode1))

fromcode1 := C.CString(fromcode)
defer C.free(unsafe.Pointer(fromcode1))

ret, err := C.iconv_open(tocode1, fromcode1)
if err != nil {
    return
}
cd = Iconv{ret}
return
 }

 func (cd Iconv) Close() error {

_, err := C.iconv_close(cd.Handle)
return err
}

func (cd Iconv) Conv(b []byte, outbuf []byte) (out []byte, inleft int, err error) {

outn, inleft, err := cd.Do(b, len(b), outbuf)    
if err == nil && err != E2BIG {
    out = outbuf[:outn]
    return
}

w := bytes.NewBuffer(nil)
w.Write(outbuf[:outn])

inleft, err = cd.DoWrite(w, b[len(b)-inleft:], inleft, outbuf)
out = w.Bytes()
return
 }

func (cd Iconv) ConvString(s string) string {
var outbuf [512]byte
s1, _, _ := cd.Conv([]byte(s), outbuf[:])
return string(s1)
}

func (cd Iconv) Do(inbuf []byte, in int, outbuf []byte) (out, inleft int, err error) {

if in == 0 { return }

inbytes := C.size_t(in)
inptr := &inbuf[0]

outbytes := C.size_t(len(outbuf))
outptr := &outbuf[0]
_, err = C.iconv(cd.Handle,
    (**C.char)(unsafe.Pointer(&inptr)), &inbytes,
    (**C.char)(unsafe.Pointer(&outptr)), &outbytes)

out = len(outbuf) - int(outbytes)
inleft = int(inbytes)
return
}

func (cd Iconv) DoWrite(w io.Writer, inbuf []byte, in int, outbuf []byte) (inleft int, err error) {

if in == 0 { return }

inbytes := C.size_t(in)
inptr := &inbuf[0]

for inbytes > 0 {
    outbytes := C.size_t(len(outbuf))
    outptr := &outbuf[0]
    _, err = C.iconv(cd.Handle,
        (**C.char)(unsafe.Pointer(&inptr)), &inbytes,
        (**C.char)(unsafe.Pointer(&outptr)), &outbytes)
    w.Write(outbuf[:len(outbuf)-int(outbytes)])
    if err != nil && err != E2BIG {
        return int(inbytes), err
    }
}

return 0, nil
}

我在win7下编译运行报:

error: 'iconv_t' undeclared (first use in this function)
error: 'free' undeclared (first use in this function)
error: 'iconv_open' undeclared (first use in this function)
error: 'iconv_close' undeclared (first use in this function)
error: 'EILSEQ' undeclared (first use in this function)
error: 'E2BIG' undeclared (first use in this function)
error: 'iconv' undeclared (first use in this function)

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

4136 次点击  
加入收藏 微博
3 回复  |  直到 2014-03-06 14:14:41
polaris
polaris · #1 · 11年之前

Windows下可能不太好弄成功,#include <iconv.h> 需要 iconv 支持。可能安装 cygwin 可能可以,但还是不建议在Windows下搞,要用还是到 *nix 弄吧,比如 Linux。

lauking
lauking · #2 · 11年之前
polarispolaris #1 回复

Windows下可能不太好弄成功,#include 需要 iconv 支持。可能安装 cygwin 可能可以,但还是不建议在Windows下搞,要用还是到 *nix 弄吧,比如 Linux。

嗯,我装的MinGW用GDB调试,我是想把GBK的字符串转化成UTF-8的,有没别的方法?

polaris
polaris · #3 · 11年之前

可以看看这里 Go中进行字符集转换

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传