Hola
Este código se supone me debería devolver una "á" pero en cambio devuelve letras chinas
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 (http://www.utf8-chartable.de/)
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:
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():
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í:
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:
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:
Dim ucCode As Integer
If Integer.TryParse("00E1", NumberStyles.HexNumber, CultureInfo.CurrentCulture, ucCode) Then
' ...
End If
Saludos!
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:
msgbox(Convert.ToChar(Convert.ToInt32(&HE1)))
Gracias
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.
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...
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í
... New Byte() {"C3A1"}
ya sí
... 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í...
Dim vIn() As Byte = New Byte() {&HC3, &HA1}
Dim vOut As String = System.Text.Encoding.UTF8.GetString(vIn)
MsgBox(vOut)