V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
freehere
V2EX  ›  Go 编程语言

golang 分享一个将 windows 记事本各种编码文字转成 utf8

  •  
  •   freehere ·
    freehere107 · 2017-06-27 14:21:20 +08:00 · 1385 次点击
    这是一个创建于 2704 天前的主题,其中的信息可能已经有所发展或是发生改变。

    起初想用 unoconv 将各类文档转成 pdf,txt 确实是一头包。这个方法基本可以将 txt 4 种格式都统一起来。 注意 linux 下需设置

    LANG C.UTF-8

    package until
    
    import (
    	"unicode/utf16"
    	"bytes"
    	"golang.org/x/text/encoding/simplifiedchinese"
    	"golang.org/x/text/transform"
    	"io/ioutil"
    )
    
    func Utf16toString(b []uint8) (string) {
    	if len(b)&1 != 0 {
    		return string(b)
    	}
    	var bom int
    	if len(b) >= 2 {
    		switch n := int(b[0])<<8 | int(b[1]); n {
    		case 0xfffe:
    			bom = 1
    			fallthrough
    		case 0xfeff:
    			b = b[2:]
    			w := make([]uint16, len(b)/2)
    			for i := range w {
    				w[i] = uint16(b[2*i+bom&1])<<8 | uint16(b[2*i+(bom+1)&1])
    			}
    			return string(utf16.Decode(w))
    		default:
    			gbk, _ := GbkToUtf8(b)
    			return string(gbk)
    		}
    	} else {
    		return string(b)
    	}
    
    }
    
    func GbkToUtf8(s []byte) ([]byte, error) {
    	reader := transform.NewReader(bytes.NewReader(s), simplifiedchinese.GBK.NewDecoder())
    	d, e := ioutil.ReadAll(reader)
    	if e != nil {
    		return nil, e
    	}
    	return d, nil
    }
    
    
    第 1 条附言  ·  2017-06-29 18:29:26 +08:00

    utf8识别不是很好,今天做了一些修改

    func Utf16toString(b []uint8) (string) {
    	var bom int
    	if len(b) >= 2 {
    		switch n := int(b[0])<<8 | int(b[1]); n {
    		case 0xfffe:
    			bom = 1
    			fallthrough
    		case 0xfeff:
    			b = b[2:]
    			w := make([]uint16, len(b)/2)
    			for i := range w {
    				w[i] = uint16(b[2*i+bom&1])<<8 | uint16(b[2*i+(bom+1)&1])
    			}
    			return string(utf16.Decode(w))
    		case 0x564d:
    			gbk, _ := GbkToUtf8(b)
    			return string(gbk)
    		default:
    			return string(b)
    		}
    	} else {
    		return string(b)
    	}
    
    }
    
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1612 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 16:54 · PVG 00:54 · LAX 08:54 · JFK 11:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.