Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Lekim en 23 Febrero 2016, 10:48 am



Título: UTF8 A UNICODE
Publicado por: Lekim en 23 Febrero 2016, 10:48 am
Hola

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

Código
  1.                Dim UTFString As String = Convert.ToChar(Convert.ToInt32("C3A1", 16))
  2.        Dim Result As String = Encoding.Unicode.GetString(Encoding.UTF8.GetBytes(UTFString))
  3.        TextBox1.Text = Result


¿Alguien sabe por qué?
Saludos


info:

UTF-8 encoding table and Unicode characters (http://www.utf8-chartable.de/)


Título: Re: UTF8 A UNICODE
Publicado por: Eleкtro en 23 Febrero 2016, 13:04 pm
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
  1. Dim enc As Encoding = Encoding.Unicode
  2. Dim data As Byte() = enc.GetBytes("á")
  3. Dim str As String = enc.GetString(ucData)
  4. Debug.WriteLine(str)

Para convertir entre codificaciones, se utiliza la función Encoding.Convert():
Código
  1. Dim utf8 As Encoding = Encoding.UTF8
  2. Dim uc As Encoding = Encoding.Unicode
  3.  
  4. Dim utf8Data As Byte() = utf8.GetBytes("á")
  5. Dim ucData As Byte() = Encoding.Convert(utf8, uc, utf8Data)
  6.  
  7. Dim ucStr As String = uc.GetString(ucData)
  8. Debug.WriteLine(ucStr)

Tú código también podría ser así:
Código
  1. Dim ucEnc As Encoding = Encoding.Unicode
  2. Dim ucCode As Integer = &HE1 ' U+00E1 = 255 = á
  3. Dim ucChar As Char = Convert.ToChar(ucCode)
  4. Dim ucData As Byte() = ucEnc.GetBytes(ucChar)
  5. Dim ucStr As String = ucEnc.GetString(ucData)
  6. 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
  1. 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
  1. Dim ucCode As Integer
  2. If Integer.TryParse("00E1", NumberStyles.HexNumber, CultureInfo.CurrentCulture, ucCode) Then
  3.    ' ...
  4. End If

Saludos!


Título: Re: UTF8 A UNICODE
Publicado por: Lekim en 23 Febrero 2016, 14:19 pm
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
  1. msgbox(Convert.ToChar(Convert.ToInt32(&HE1)))


Gracias


Título: Re: UTF8 A UNICODE
Publicado por: Eleкtro en 23 Febrero 2016, 14:39 pm
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
  1. Dim utf8data As Byte() = New Byte() {&HC3, &HA1}
  2. Dim ucData As Byte() = Encoding.Convert(Encoding.UTF8, Encoding.Unicode, utf8data)
  3. Dim ucstr As String = Encoding.Unicode.GetString(ucData)
  4. Debug.WriteLine(ucstr)

Saludos...


Título: Re: UTF8 A UNICODE
Publicado por: Lekim en 23 Febrero 2016, 14:52 pm
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
  1. ... New Byte() {"C3A1"}

ya sí

Código
  1. ... New Byte() {"C3", "A1"}

lógico no funcionaba  :P


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

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

Código
  1. Dim vIn() As Byte = New Byte() {&HC3, &HA1}
  2.        Dim vOut As String = System.Text.Encoding.UTF8.GetString(vIn)
  3.        MsgBox(vOut)