2011-08-03 14 views

Odpowiedz

3

Napisałem funkcję, która była przydatna dla mnie, może ktoś inny może z niej skorzystać. Konwertuje z Windows-1252 na UTF-8. Mam przeliczone kilka punktów kod, który Windows-1252 traktuje jako znaki Unicode, ale uważa się znaki sterujące (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

Oto nowsza metoda.

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) 
} 

ja byliśmy wykorzystanie iconv-go zrobić takiego nawróconego, trzeba wiedzieć, jaka jest twoja strona kodowa ANSI, w moim przypadku jest to „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 pakiet posiada funkcje dokładnie tego problemu

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 
} 

Edit: undefined: ba ma zastąpić enc

Powiązane problemy