UTF8 A UNICODE

Iniciado por Lekim, 23 Febrero 2016, 10:48 AM

0 Miembros y 1 Visitante están viendo este tema.

Lekim

Hola

Este código se supone me debería devolver una "á" pero en cambio devuelve letras chinas

Código (vbnet) [Seleccionar]
               Dim UTFString As String = Convert.ToChar(Convert.ToInt32("C3A1", 16))
       Dim Result As String = Encoding.Unicode.GetString(Encoding.UTF8.GetBytes(UTFString))
       TextBox1.Text = Result



¿Alguien sabe por qué?
Saludos


info:

UTF-8 encoding table and Unicode characters


Eleкtro

#1
La función Encoding.GetString() no convierte entre codificaciones, sino que espera recibir una secuencia de bytes que pertenezcan A LA MISMA CODIFICIACIÓN, sin embargo, tú le estás pasando unos bytes utf-8 a la función GetString de la codificación Unicode (utf-16), por lo que no va a darte los resultados esperados.

Un ejemplo de como se debe utilizar el método mencionado:
Código (vbnet) [Seleccionar]
Dim enc As Encoding = Encoding.Unicode
Dim data As Byte() = enc.GetBytes("á")
Dim str As String = enc.GetString(ucData)
Debug.WriteLine(str)


Para convertir entre codificaciones, se utiliza la función Encoding.Convert():
Código (vbnet) [Seleccionar]
Dim utf8 As Encoding = Encoding.UTF8
Dim uc As Encoding = Encoding.Unicode

Dim utf8Data As Byte() = utf8.GetBytes("á")
Dim ucData As Byte() = Encoding.Convert(utf8, uc, utf8Data)

Dim ucStr As String = uc.GetString(ucData)
Debug.WriteLine(ucStr)


Tú código también podría ser así:
Código (vbnet) [Seleccionar]
Dim ucEnc As Encoding = Encoding.Unicode
Dim ucCode As Integer = &HE1 ' U+00E1 = 255 = á
Dim ucChar As Char = Convert.ToChar(ucCode)
Dim ucData As Byte() = ucEnc.GetBytes(ucChar)
Dim ucStr As String = ucEnc.GetString(ucData)
Debug.WriteLine(ucStr)


Consejos:
- Lee las descripciones de los métodos antes de utilizarlos, no creo que tuvieses estas dudas de hacerlo, su funcionalidad es clara.

- Para convertir los códigos hexadecimales de Unicode también puedes utilizar la función Integer.Parse() (simple comentario, por que me gusta más su utilización), ejemplo:
Código (vbnet) [Seleccionar]
Integer.Parse("00E1", NumberStyles.HexNumber) ' U+00E1 = 255 = á

   o la función Integer.TryParse(), que aportaría mayor control de errores en tu código:
Código (vbnet) [Seleccionar]
Dim ucCode As Integer
If Integer.TryParse("00E1", NumberStyles.HexNumber, CultureInfo.CurrentCulture, ucCode) Then
    ' ...
End If


Saludos!








Lekim

#2
Hola Elektro

Gracias por responder pero lamentablemente no respondes a mi cuestión.

Antes de nada comentarte que as tenido errorcillo de escritura ya que á no es igual a 255 sino a 225.

Por otro lado decir que creo haber dejado bien clara la cuestión y es pasar código UTF-8 a Unicode, es decir de  C3A1 o bien 0xC3 0xA1   obtener "á".. Y no pasar un valor hexadecimal E1 o bien &HE1 y obtener á, porque para eso hago esto y listo:

Código (vbnet) [Seleccionar]
msgbox(Convert.ToChar(Convert.ToInt32(&HE1)))


Gracias

Eleкtro

#3
Hay una diferencia entre no responder a la pregunta, y no darlo todo hecho, vuelve a leer la parte donde menciono como convertir entre codificaciones.

Código (vbnet) [Seleccionar]
Dim utf8data As Byte() = New Byte() {&HC3, &HA1}
Dim ucData As Byte() = Encoding.Convert(Encoding.UTF8, Encoding.Unicode, utf8data)
Dim ucstr As String = Encoding.Unicode.GetString(ucData)
Debug.WriteLine(ucstr)


Saludos...








Lekim

#4
joder, ahora sí Elektro

Ese código lo encontré en google pero no se me ocurrió poner el código por separado yo lo ponía así

Código (vbnet) [Seleccionar]
... New Byte() {"C3A1"}

ya sí

Código (vbnet) [Seleccionar]
... New Byte() {"C3", "A1"}

lógico no funcionaba  :P


http://www.convertdatatypes.com/Convert-Byte-Array-to-String-in-VB.net.html

Según el cual quedaría así...

Código (vbnet) [Seleccionar]
Dim vIn() As Byte = New Byte() {&HC3, &HA1}
       Dim vOut As String = System.Text.Encoding.UTF8.GetString(vIn)
       MsgBox(vOut)