2011-08-03 20 views
6

Cómo convertir texto ansi a utf8 en golang (ir al idioma)? Intento convertir cadena ansi a cadena utf8.ir a la lengua cómo convertir el texto ansi a utf8?

+5

lo que es "ANSI"? – newacct

+4

ANSI? ¿Qué es esto, 1982? –

+1

@newacct [ASCII No debe confundirse con Windows-1252, también conocido como "ANSI"] (http://en.wikipedia.org/wiki/ASCII). –

Respuesta

3

He escrito una función que fue útil para mí, tal vez alguien más puede usar esto. Se convierte de Windows-1252 a UTF-8. Me he convertido en algunos puntos de código que Windows-1252 trata como caracteres Unicode, pero considera que son caracteres de control (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

Aquí es más nuevo método.

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

que eran utilización iconv-go para hacer tal convertido, debe conocer cuál es tu página de códigos ANSI, en mi caso, es '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 paquete tiene funciones exactamente para este problema

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 
} 

Editar: undefined: ba es reemplazar enc