elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)



+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  UTF8 A UNICODE
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: UTF8 A UNICODE  (Leído 1,271 veces)
Lekim

Desconectado Desconectado

Mensajes: 268



Ver Perfil
UTF8 A UNICODE
« 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



« Última modificación: 23 Febrero 2016, 10:55 am por Lekim » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.708



Ver Perfil
Re: UTF8 A UNICODE
« Respuesta #1 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!


« Última modificación: 23 Febrero 2016, 13:18 pm por Eleкtro » En línea


Lekim

Desconectado Desconectado

Mensajes: 268



Ver Perfil
Re: UTF8 A UNICODE
« Respuesta #2 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
« Última modificación: 23 Febrero 2016, 14:23 pm por Lekim » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.708



Ver Perfil
Re: UTF8 A UNICODE
« Respuesta #3 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...
« Última modificación: 23 Febrero 2016, 15:01 pm por Eleкtro » En línea


Lekim

Desconectado Desconectado

Mensajes: 268



Ver Perfil
Re: UTF8 A UNICODE
« Respuesta #4 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

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)

« Última modificación: 23 Febrero 2016, 15:02 pm por Lekim » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
problema con utf8 y ansi
PHP
johnwmartinez 8 4,398 Último mensaje 27 Enero 2008, 05:41 am
por ???
Problema con INCLUDE y Codificacion UTF8
PHP
Skeletron 1 4,319 Último mensaje 14 Marzo 2010, 18:06 pm
por Skeletron
Crear fichero txt utf8 en C++
Programación C/C++
cassiel83 0 1,474 Último mensaje 10 Abril 2012, 21:04 pm
por cassiel83
MATCH AGAINST y utf8
Bases de Datos
sexto 2 1,050 Último mensaje 16 Abril 2015, 16:21 pm
por sexto
Normalizar URL (pasar Url de UTF8 a Unicoce)
.NET (C#, VB.NET, ASP)
Lekim 3 1,251 Último mensaje 23 Febrero 2016, 18:03 pm
por Eleкtro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines