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)
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)
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)
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!