2011-08-03 31 views
6

ansiテキストをgolangのutf8に変換するにはどうすればいいですか? ansi文字列をutf8文字列に変換しようとしています。ansiテキストをutf8に変換するにはどうすればいいですか?

+5

"ANSI" を何置き換えるのですか? – newacct

+4

ANSI?これは1982年ですか? –

+1

@newacct [ASCII]「ANSI」とも呼ばれるWindows-1252と混同しないでください(http://en.wikipedia.org/wiki/ASCII)。 –

答えて

2

変換を自分で書いたり、サードパーティのパッケージを使用せずにそれを行うための方法はありません。これを使ってみることができます:http://code.google.com/p/go-charset

3

私は役に立つかもしれない関数を書いていますが、他の誰かがこれを使うことができます。 Windows-1252からUTF-8に変換されます。私は文字としていくつかのコード・ポイントWindows-1252お菓子を変換しましたが、Unicodeの制御文字(http://en.wikipedia.org/wiki/Windows-1252

func fromWindows1252(str string) string { 
    var arr = []byte(str) 
    var buf bytes.Buffer 
    var r rune 

    for _, b := range(arr) { 
     switch b { 
     case 0x80: 
      r = 0x20AC 
     case 0x82: 
      r = 0x201A 
     case 0x83: 
      r = 0x0192 
     case 0x84: 
      r = 0x201E 
     case 0x85: 
      r = 0x2026 
     case 0x86: 
      r = 0x2020 
     case 0x87: 
      r = 0x2021 
     case 0x88: 
      r = 0x02C6 
     case 0x89: 
      r = 0x2030 
     case 0x8A: 
      r = 0x0160 
     case 0x8B: 
      r = 0x2039 
     case 0x8C: 
      r = 0x0152 
     case 0x8E: 
      r = 0x017D 
     case 0x91: 
      r = 0x2018 
     case 0x92: 
      r = 0x2019 
     case 0x93: 
      r = 0x201C 
     case 0x94: 
      r = 0x201D 
     case 0x95: 
      r = 0x2022 
     case 0x96: 
      r = 0x2013 
     case 0x97: 
      r = 0x2014 
     case 0x98: 
      r = 0x02DC 
     case 0x99: 
      r = 0x2122 
     case 0x9A: 
      r = 0x0161 
     case 0x9B: 
      r = 0x203A 
     case 0x9C: 
      r = 0x0153 
     case 0x9E: 
      r = 0x017E 
     case 0x9F: 
      r = 0x0178 
     default: 
      r = rune(b) 
     } 

     buf.WriteRune(r) 
    } 

    return string(buf.Bytes()) 
} 
3

ここでは、新しい方法であると考えています。

package main  
import (
    "bytes" 
    "fmt" 
    "io/ioutil"  
    "golang.org/x/text/encoding/traditionalchinese" 
    "golang.org/x/text/transform" 
)  
func Decode(s []byte) ([]byte, error) { 
    I := bytes.NewReader(s) 
    O := transform.NewReader(I, traditionalchinese.Big5.NewDecoder()) 
    d, e := ioutil.ReadAll(O) 
    if e != nil { 
     return nil, e 
    } 
    return d, nil 
} 
func main() { 
    s := []byte{0xB0, 0xAA} 
    b, err := Decode(s) 
    fmt.Println(string(b)) 
    fmt.Println(err) 
} 

私は使用のiconv-行く、そのような変換を行うにして、あなたのANSIコードページが何を知っている必要があり、私の場合、それはBIG5」です。

package main 
import (
    "fmt" 
    //iconv "github.com/djimenez/iconv-go" 
    iconv "github.com/andelf/iconv-go" 
    "log" 
) 

func main() { 
    ibuf := []byte{170,76,80,67} 
    var obuf [256]byte 

    // Method 1: use Convert directly 
    nR, nW, err := iconv.Convert(ibuf, obuf[:], "big5", "utf-8") 
    if err != nil { 
     log.Fatalln(err) 
    } 
    log.Println(nR, ibuf) 
    log.Println(obuf[:nW]) 
    fmt.Println(string(obuf[:nW])) 

    // Method 2: build a converter at first 
    cv, err := iconv.NewConverter("big5", "utf-8") 
    if err != nil { 
     log.Fatalln(err) 
    } 
    nR, nW, err = cv.Convert(ibuf, obuf[:]) 
    if err != nil { 
     log.Fatalln(err) 
    } 
    log.Println(string(obuf[:nW])) 
} 
0

golang.org/x/text/encoding/charmapパッケージは、まさにこの問題のための機能を備えてい

import "golang.org/x/text/encoding/charmap" 

func DecodeWindows1250(enc []byte) string { 
    dec := charmap.Windows1250.NewDecoder() 
    out, _ := dec.Bytes(enc) 
    return string(out) 
} 

func EncodeWindows1250(inp string) []byte { 
    enc := charmap.Windows1250.NewEncoder() 
    out, _ := enc.String(inp) 
    return out 
} 

編集:undefined: baenc

関連する問題