在网上搜索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. windows下go编码转换问题

    github上有两个package做编码转换,都是基于iconv,用到了cgo,在linux下没有问题,在windows下用,非常麻烦.采用mingw安装libiconv也不行,一直提示找不到libi ...

  3. 使用vbs脚本进行批量编码转换

    使用vbs脚本进行批量编码转换 最近需要使用SourceInsight查看分析在Linux系统下开发的项目代码,我们知道Linux系统中文本文件默认编码格式是UTF-8,而Windows中文系统中的默 ...

  4. 关于JS的编码转换问题

    在进行JS开发过程中,尤其是在开发报表时,报表已集成到Web页面中,通过在页面传递参数至报表中时,会发现有时某些参数值,传递到报表中是显示为问号或乱码等等一系列不能正常显示的情况. 这是由于浏览器和报 ...

  5. 帆软报表FineReport数据库连接编码转换

    1. 问题描述 数据库会以某种编码方式保存与读取数据,FineReport解析时默认使用GBK字符集,若数据库端编码与设计器端编码不一致时,就会导致中文及特殊字符的乱码. FineReport在定义数 ...

  6. 编码转换的处理 DreamWeaver SC6 打开会出现javacsript出现问题的处理

      编码转换的处理: 打开DW后,修改里面有个"页面属性": 点击页面属性,会弹出一个窗口,点击"标题/编码",在"编码"里面选择你要转换的 ...

  7. C++ 字符编码转换类

    记录一下C++ 编码转换的函数: #pragma once #include "afx.h" #define DEFAULT_CODE 0 #define CHINESE_SIMP ...

  8. [2015.02.02]文本编码转换专家 v2.6

    软件名称:文本编码转换专家最新版本:v2.6操作系统:XP/2003/Win7/Win2008软件介绍:文本编码转换专家,界面简洁易用,功能强大实用.自动识别文件编码,有效转换成目标编码.真正的多线程 ...

  9. python 字符编码 转换

    #!/bin/env python#-*- encoding=utf8 -*-# 文件头指定utf8编码还是乱码时,使用下面方式指定# fix encoding problem import sys ...

随机推荐

  1. word中设置前几页为罗马数字,后几页设置为阿拉伯数字

    假如第1-5页摘要部分页脚要是罗马数字,第6页开始是正文部分是阿拉伯数字,起始页为1. WORD2003 1.将光标定位在第5页末尾处,在菜单栏中依次点击“插入——分隔符——(分节符类型)下一页”.按 ...

  2. 深度剖析C++对象池自动回收技术实现

    http://www.tuicool.com/articles/mQBfQfN 对象池可以显著提高性能,如果一个对象的创建非常耗时或非常昂贵,频繁去创建的话会非常低效.对象池通过对象复用的方式来避免重 ...

  3. 关于Filter的配置

    配置代码: <filter> <display-name>OneFilter</display-name>  <filter-name>OneFilte ...

  4. http模式

    http遵守请求响应模式: 请求: 请求行:HTTP方法-请求的URL-HTTP版本 请求行 空行 消息体 响应: 状态行:HTTP版本-响应码-响应描述 响应头 空行 消息体 其他的重点: http ...

  5. 制作透明色:《CSS3 RGBA》与Opacity样式用法

    前面我们一起探讨了一下CSS3 Gradient(css3 渐变),今天我们一起来探讨一下CSS3中的RGBA.RGB对于大家来说一点不陌生,他就是红色R+绿色G+蓝色B,那现在我们所说的RGBA又是 ...

  6. 批量清除.svn 或 _svn

    Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN]@=&q ...

  7. winform 配置文件的加密解密

    winform 配置文件的加密解密Visual Studio 命令提示(2010) 窗口下直接输入 :解密aspnet_regiis -pdf connectionStrings 程序文件夹全目录 加 ...

  8. 各操作系统配置java环境变量

    Windows 1. JAVA_HOME -->>  E:\java-tools\Java\JDK8_64\jdk1.8.0_77 2. path -->> %JAVA_HOM ...

  9. Web的Ajax应用开发模式(一)——了解Ajax的使用形式

    寄语: 前天在查看一些公司的招聘要求时,看到有公司要求测试人员了解Ajax,故写此博文旨在帮助测试人员提高自身技术知识水平,愿与广大测试同胞共同进步.(欢迎纠错!!!) 图1: 图2:

  10. 2012 #3 Flowers

    Flowers Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Stat ...