标签:raphael lov 中文 lan odi god 迁移 zhang 资料
在网上搜索golang编码转化时,我们经常看到的文章是使用下面一些第三方库:
https://github.com/djimenez/iconv-go
https://github.com/qiniu/iconv
如果我们在windows下使用这个库,会看到错误:
iconv.go:6:20: fatal error: iconv.h: No such file or directory 
compilation terminated.
这是因为需要系统有 iconv.h 文件。 linux、mac下自带了这个,windows 下没有。
如何让win下有这个C的代码,网上一堆说法。
比如,
1、使用 cygwin
https://github.com/qiniu/iconv/issues/6
在cygwin中安装gcc编译器   
http://qichunren.iteye.com/blog/214527
反正这个环境,我在win下没有搭建起来,网上能看到这么说的:
go is not compatible with cygwin (either 32bit or 64bit), please use mingw.
https://code.google.com/p/go/issues/detail?id=7265
2、有人推荐使用 tdm gcc mingw
http://zhidao.baidu.com/question/744915659430101412.html
后来 install tdm gcc mingw to selove bellow problem 解决问题.   
http://tdm-gcc.tdragon.net/download
这套方案我也没有搞定。
3、至于使用 mingw 的方案, 也没搞定。
最后搞定的方式,是发现有个直接用Go实现编码转化的包:
对应的代码如下:
import (   
    "bytes"    
    "code.google.com/p/go.text/encoding/simplifiedchinese"    
    "code.google.com/p/go.text/transform"    
    "io/ioutil"    
)    
func Decode(s []byte) ([]byte, error) {    
    I := bytes.NewReader(s)    
    defer I.Close()    
    O := transform.NewReader(I, simplifiedchinese.GBK.NewDecoder())    
    defer O.Close()    
    d, e := ioutil.ReadAll(O)    
    if e != nil {    
        return nil, e    
    }    
    return d, nil    
}
code.google.com/p/go.benchmarks -> golang.org/x/benchmarks
code.google.com/p/go.blog -> golang.org/x/blog
code.google.com/p/go.crypto -> golang.org/x/crypto
code.google.com/p/go.exp -> golang.org/x/exp
code.google.com/p/go.image -> golang.org/x/image
code.google.com/p/go.mobile -> golang.org/x/mobile
code.google.com/p/go.net -> golang.org/x/net
code.google.com/p/go.sys -> golang.org/x/sys
code.google.com/p/go.talks -> golang.org/x/talks
code.google.com/p/go.text -> golang.org/x/text
code.google.com/p/go.tools -> golang.org/x/tools
相关参考资料:
Golang 字符编码   
http://www.cnblogs.com/lyqf365/p/3739533.html
这里有下载网页并转码的例子。
Go的官方编码转换包   
http://blog.raphaelzhang.com/2014/01/go-official-support-for-charset-encoding/
Go如何处理zip中的中文文件名   
http://my.oschina.net/chai2010/blog/186211
http://bbs.carlaau.com/go/t73-1-1.html
go language how to convert ansi text to utf8?   
http://stackoverflow.com/questions/6927611/go-language-how-to-convert-ansi-text-to-utf8/6933412#6933412
另外,还有一个 go-charset 包(https://code.google.com/p/go-charset/)
相关文档在:
https://godoc.org/code.google.com/p/go-charset/charset
它支持下面这些编码的转换。
big5 ibm437 ibm850 ibm866 iso-8859-1 iso-8859-10 iso-8859-15 iso-8859-2 iso-8859-3 iso-8859-4 iso-8859-5 iso-8859-6 iso-8859-7 iso-8859-8 iso-8859-9 koi8-r utf-16 utf-16be utf-16le utf-8 windows-1250 windows-1251 windows-1252
它的相关例子请参考:http://stackoverflow.com/questions/24555819/golang-persist-using-iso-8859-1-charset
package main
import (
    "bytes"
    "code.google.com/p/go-charset/charset"
    _ "code.google.com/p/go-charset/data"
    "fmt"
    "io/ioutil"
    "strings"
)
func toISO88591(utf8 string) (string, error) {
    buf := new(bytes.Buffer)
    w, err := charset.NewWriter("latin1", buf)
    if err != nil {
        return "", err
    }
    fmt.Fprintf(w, utf8)
    w.Close()
    return buf.String(), nil
}
func fromISO88591(iso88591 string) (string, error) {
    r, err := charset.NewReader("latin1", strings.NewReader(iso88591))
    if err != nil {
        return "", err
    }
    buf, err := ioutil.ReadAll(r)
    if err != nil {
        return "", err
    }
    return string(buf), nil
}
func main() {
    utfi := "£5 for Peppé"
    fmt.Printf("%q\n", utfi)
    iso, err := toISO88591(utfi)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Printf("%q\n", iso)
    utfo, err := fromISO88591(iso)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Printf("%q\n", utfo)
    fmt.Println(utfi == utfo)
}
上面代码的输出:
"£5 for Peppé"
"\xa35 for Pepp\xe9"
"£5 for Peppé"
true
标签:raphael lov 中文 lan odi god 迁移 zhang 资料
原文地址:http://www.cnblogs.com/zhangym/p/6142478.html