在网上搜索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.text , 这些包都被迁移到 golang.org/x 这里了, 对应的迁移映射关系如下: 

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

golang 编码转化的更多相关文章

  1. golang编码转换

    在网上搜索golang编码转化时,我们经常看到的文章是使用下面一些第三方库: https://github.com/djimenez/iconv-go https://github.com/qiniu ...

  2. IOS编码转化

    原文地址:http://blog.csdn.net/huifeidexin_1/article/details/7883984 iOS中编码转化 1.UTF-8转化 NSString *data =  ...

  3. Nodejs编码转化问题

    目前Node.js仅支持hex.utf8.ascii.binary.base64.ucs2几种编码的转换.对于GBK,GB2312等编码,Nodejs自带的toString()方法不支持,因此中文转化 ...

  4. 宽字符、多字节、unicode、utf-8、gbk编码转化

    今天遇到一个编码的问题,困惑了我很长时间,所以就简要的的了解了一下常用的编码类型. 我们最常见的是assic编码,它是一种单字节编码,对多容纳256个字符. 我们在编程的时候经常遇到unicode,u ...

  5. [ACM_模拟] POJ1068 Parencodings (两种括号编码转化 规律 模拟)

    Description Let S = s1 s2...s2n be a well-formed string of parentheses. S can be encoded in two diff ...

  6. 报表开发工具中mysql数据库连接编码转化失效解决方案

    1. 问题描述 在报表开发工具FineReport中,mysql数据库连接通过数据连接编码转换进行编码的转换,在通过报表录入往数据库中录入中文数据的时候,总是出现乱码,这个该怎么解决呢? 2. 解决方 ...

  7. java编码转化方案-备用

    import java.io.UnsupportedEncodingException; /** * 转换字符串的编码 */ public class changeCharSet { /** 7位AS ...

  8. 将UTF8编码转化为中文 - NSString方法

    方法一: 代码如下,如有更好的方法 麻烦贴出来,这个方法是通过webview进行解码的 UIWebView *web = [[UIWebView alloc] init]; NSString *tsw ...

  9. native2ascii -- 编码转化工具

    参考文档 http://blog.chinaunix.net/uid-692788-id-2681133.html 功能说明 Java 编译器和其它 Java 工具只能处理含有 Latin-1 和/或 ...

随机推荐

  1. leecode刷题(21)-- 删除链表的倒数第N个节点

    leecode刷题(21)-- 删除链表的倒数第N个节点 删除链表的倒数第N个节点 描述: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2- ...

  2. Sublime关于tab转空格的设置技巧

    在编写大的工程的代码的时候,会要求一些多余的字符不应该存在,比如说末尾不应该有空格或者Tab这样的字符,比如说所有的Tab应该变成空格,这样工程不管在什么样的编辑器下看,格式都会比较统一,等等,可是如 ...

  3. Metasploit域渗透测试全程实录(终结篇)

    本文作者:i春秋签约作家——shuteer 前言 内网渗透测试资料基本上都是很多大牛的文章告诉我们思路如何,但是对于我等小菜一直是云里雾里.于是使用什么样的工具才内网才能畅通无阻,成了大家一直以来的渴 ...

  4. SAE实践——用SVN命令行同步/提交代码

    1. 同步应用到本地 注:首次使用svn需要输入安全认证密码 在终端输入以下命令 svn co https://svn.sinaapp.com/nyhello nyhello替换为自己的应用名称. 用 ...

  5. SPI 用户空间的读写操作

    spi_device 虽然用户空间不需要直接用到spi_device结构体,但是这个结构体和用户空间的程序有密切的关系,理解它的成员有助于理解SPI设备节点的IOCTL命令,所以首先来介绍它.在内核中 ...

  6. JS实现表格列宽拖动

    在数据表格中,有时候需要拖动表格宽度,查看完整的数据,是很常用的功能. 1 效果 可以用纯JS就可以实现,如下,是正常情况下的表格: 拖动表格标题中间线,拖动后效果如下: 查看DEMO 2 代码 HT ...

  7. PXE+Kickstart 批量安装CentOS 7

    安装之前 将需要安装 CentOS 的服务器与 PXE 服务器通过网络设备连接:PXE 服务器安装 CentOS,并且关闭firewalld.selinux,设置静态IP地址,本例设为10.0.0.1 ...

  8. 使用scp命令,远程上传下载文件/文件夹

    1.从服务器下载文件 scp username@servername:/path/filename /local/path例如: scp ubuntu@117.50.20.56:/ygf/data/d ...

  9. [黑科技]跑的比fread还快的cin挂和cout挂

    CCPC赛后摸鱼搞了个新的奇怪外挂 这里贴上利用sgetn和sputn来实现的读入读出挂,理论上比fread更优 期望在赛中TLE的代码能强行卡过去hhh 利用小规模的Codeforces - 103 ...

  10. MVC3权限验证,诡异的OnAuthorization

    mvc3权限验证 protected override void OnAuthorization(AuthorizationContext filterContext) { if (//开始权限验证返 ...