0

me gustaría saber como puedo aplicar el utf8 a un string en golang. Investigando en la documentación, realice el siguiente:

Yo estoy realizando una consulta a una base de datos y en el campo se almacena la siguiente información ANDRÉS NUÑEZ al realizar la consulta, en la variable se almacena ANDR�S NU�EZ, despues de revisar, realice el siguiente código:

Estructura de variable:

type DataBD struct {
    ID       int
    Nom_User string
}

Conexión a la BD:

db, err := sql.Open("odbc", "DSN=" + host)

Código Utf8:

str := Data.nombre
        for len(str) > 0 {
            r, size := utf8.DecodeRuneInString(str)
            log.Printf("%c %c\n", r, size)

            str = str[size:]
        }

Pero el resultado sigue siendo el mismo. Aclaro que estoy importando import "unicode/utf8".

RESULTADO:

2018/05/29 08:48:55 A
2018/05/29 08:48:55 N
2018/05/29 08:48:55 D
2018/05/29 08:48:55 R
2018/05/29 08:48:55 �
2018/05/29 08:48:55 S
2018/05/29 08:48:55 
2018/05/29 08:48:55 N
2018/05/29 08:48:55 U
2018/05/29 08:48:55 �
2018/05/29 08:48:55 E
2018/05/29 08:48:55 Z
Andrés
  • 1,107
  • 1
  • 6
  • 26
  • Es probable que lo que necesites sea crear el objeto de la conexión a la base de datos con la codificación **`utf-8`. Supongo que aquí: `db, err := sql.Open("odbc", "DSN=" + host)`**, habrá alguna forma de indicarle que use `utf-8` como juego de caracteres... Aunque no es exactamente el mismo contexto, creo que [lo dicho aquí](https://es.stackoverflow.com/a/59510/29967) aplicaría también para tu caso, en el sentido de **atacar al problema de raíz**, estableciendo la codificación en los diferentes niveles, sin irse por las ramas. – A. Cedano May 29 '18 at 13:55
  • Prueba algo así para la conexión: `db, err := sql.Open("odbc", "DSN=" + host+"?charset=utf8")`. No estoy seguro de que funcione ya que no uso `go`. Se trata de establecer un charset adecuado al objeto conexión que estás creando. Si no es así la documentación debe explicarte cómo hacerlo. En cuanto a la base de datos, conviene que el `COLLATE` de las tablas como el de las columnas también sea una relativo a `utf-8`, pues este tipo de problemas ocurren cuando tienes establecidos `COLLATE` y charset contradictorios. La clave es simple: *todo en `utf-8` en su origen.* – A. Cedano May 29 '18 at 14:09
  • Gracias por contestar @A.Cedano , estoy revisandolo y les cuento. – Andrés May 29 '18 at 14:15
  • No logre incorporarlo :/, de todas formas gracias @A.Cedano – Andrés May 29 '18 at 14:46

2 Answers2

1

Después de investigar e investigar, encontré la solución, dejo la fuente y el código en caso de que alguien se encuentre en la misma situación:

-Código:

func utf8_decode(str string)string {    
    var result string
    for i := range str {
        result += string(str[i])
    }    
    return result
}

-Implementación:

DataBD.Nombre= utf8_decode(DataBD.Nombre)

Dejo la fuente con la cual pude generar la respuesta:

https://coderwall.com/p/k7zvyg/dealing-with-unicode-in-go

Andrés
  • 1,107
  • 1
  • 6
  • 26
0

Golang tiene soporte para unicode como parte de todos sus strings, por ejemplo:

Lo que puede estar sucediendo es que la base de datos no esta transmitiendo correctamente los caracteres codificados en UTF-8. Si la BD tiene columnas especiales para almacenar strings unicode como varchar utf8_collate_ci en MySQL or nchar y nvarcharen caso de MSSQL vale la pena intentar cambiar el tipo de la columna antes

Si eso no funciona entonces uno puede intentar con forzar la conversion cambiando el tipo del campo del registro donde se almacenan los resultados, por ejemplo:

type registro {
  ID int
  Nombre []byte
}

func (r *registro) GetNombre() string {
    return string(r.Nombre)
}

Para después utilizar el valor así:

// "SELECT nombre FROM usuarios;"
// ... codigo que realiza consulta ...
for rows.Next() {
   reg := &registro{}
   if err := rows.Scan(&reg.Nombre); err != nil {
      // reportar error
   }

   fmt.Println("Nombre: ", reg.GetNombre())
}
Tristian
  • 186
  • 7
  • No funciono, siguió mostrando lo mismo, sobre la base de datos no te podría dar una respuesta, me conecto por `ODBC` a `Informix` – Andrés May 29 '18 at 16:34
  • Vale; si te connectas a informix (que versión ??) con un cliente CLI (creo que el cliente CLI se llama `dbaccess`) y ejecutas una consulta que muestre el campo "nombre" como aparecen los resultados?, sigue móstrandose el símbolo de signo de interrogación?, – Tristian May 29 '18 at 16:39
  • `Versión 3.5 a 32 bits`, cuando yo realizo la consulta en algún Administrador de `BD`, Me aparece la información bien, `Andrés Nuñez`, Pero al realiza la consulta por cualquier lenguaje, me devuelve `�`, normalmente siempre realizo un `decode` del `utf8` y se soluciona, pero en `Golang`, no e podido. – Andrés May 29 '18 at 16:44
  • Saludo, que pena molestarte siempre, quería saber si me podías dar algo de luz sobre este tema: https://es.stackoverflow.com/questions/202949/como-crear-apirest-con-go-y-framework-echo – Andrés Oct 09 '18 at 12:26