Normalizar URL (pasar Url de UTF8 a Unicoce)

Iniciado por Lekim, 23 Febrero 2016, 16:26 PM

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

Lekim

Hola

He conseguido normalizar una URL de esas con símbolos % y códigos hexadecimales. Por ejemplo:

"https%3A%2F%2Fes.noticias.locas.com%2Fdescubren-un-jupitiano-en-j%C3%BApiter-666999.html"

(no te molestes en ir que no existe, es inventado)

Agradezco la ayuda al foro y en especial a Elektro que me ha resuelto el tema de pasar un código UTF8 a Unicode.


Código (vbnet) [Seleccionar]

Option Strict Off
Imports System.Text.RegularExpressions

Public Class Form1

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       Dim strUrl As String = ("https%3A%2F%2Fes.noticias.locas.com%2Fdescubren-un-ni%C3%B1o-jupitiano-en-j%C3%BApiter-666999.html")        'Enlace
       MsgBox(NormalizarURL(strUrl))
   End Sub

   Public Function NormalizarURL(ByVal strUrl as String) As String
       'strUrl = strUrl.Replace("%3A%2F%2F", "://")
       Dim PatternUTF8_1 As String = "(%..%..?)"                                                       'Expresiones regular
       Dim PatternUTF8_2 As String = "(%..?)"                                                          'Expresiones regulares
       Dim MyRegexUTF8_1 As New Regex(PatternUTF8_1, RegexOptions.IgnoreCase)                          'Regex para doble PatternUTF8_1
       Dim MyRegexUTF8_2 As New Regex(PatternUTF8_2, RegexOptions.IgnoreCase)                          'Regex para doble PatternUTF8_2
       Dim MyMatchUTF8_1 As Match = MyRegexUTF8_1.Match(CStr(strUrl))
       Dim MyMatchUTF8_2 As Match = MyRegexUTF8_2.Match(CStr(strUrl))
       While MyMatchUTF8_1.Success
           Dim UTFChar As String = MyMatchUTF8_1.Groups(0).Value                                       'Obtiene el primer valor de cada coincidencia          
           Dim HexChar1 As Byte = CType(Convert.ToInt32(UTFChar.Substring(1, 2), 16), Byte)                'Obtiene el valor entero del primer valor hexadecimal obtenido del código utf-8
           Dim HexChar2 As Byte = CType(Convert.ToInt32(UTFChar.Substring(4, 2), 16), Byte)                    'Obtiene el valor entero del segundo valor hexadecimal obtenido del código utf-8
           '//Convierte carácter hexadecimal UTF-8 a UNICODE por ejemplo "C3 BA" a "ú"
           Dim CharUnicode As String = System.Text.Encoding.UTF8.GetString(New Byte() {HexChar1, HexChar2})
           strUrl = strUrl.Replace(UTFChar, CharUnicode)                                                      'Reemplaza el carácter hexadecimal UTF-8 por Unicode
           MyMatchUTF8_1 = MyMatchUTF8_1.NextMatch()                                                   'Continúe el bucle hasta la siguiente coincidencia.
       End While
       While MyMatchUTF8_2.Success
           Dim UTFChar As String = MyMatchUTF8_2.Groups(0).Value
           '//Convierte y remplaza un carácter hexadecimal a Unicode por ejemplo "2F" a "/"
           strUrl = strUrl.Replace(UTFChar, Convert.ToChar(Convert.ToInt32(UTFChar.Substring(1, 2), 16)))
           MyMatchUTF8_2 = MyMatchUTF8_2.NextMatch()                                                       'Continúe el bucle hasta la siguiente coincidencia.
       End While
       Return CStr(strUrl)
   End Function
End Class



Saludos


Eleкtro

#1
Hola

Antes de nada, buen código! y gracias por compartir con los demás.

Pero ...lo siguiente que voy a decir no es por fastidiar, has invertido un esfuerzo en desarrollar el código y eso es lo que se debe valorar, y como práctico/entrenamiento o alternativa me parece bien.
pero Lekim, me veo un poco en la responsabilidad de mencionar que dicha funcionalidad ya está implementada (y optimizada con el uso de For) en la librería de classes de .Net Framework:

Documentación:

El código fuente de Microsoft (para aprendizaje, o por simple curiosidad):

Un ejemplo de uso:
Código (vbnet) [Seleccionar]
Imports System.Web

Dim strUrl As String = "https%3A%2F%2Fes.noticias.locas.com%2Fdescubren-un-jupitiano-en-j%C3%BApiter-666999.html"
Console.WriteLine(HttpUtility.UrlDecode(strUrl)) ' result: https://es.noticias.locas.com/descubren-un-jupitiano-en-júpiter-666999.html


PD: Juraría que hace un tiempo preguntaste algo al respecto de decodificar los caracteres escapados de una url (-> percent-encoding <-) y te hice saber en ese momento que se podía hacer con las classes .Net Framework ...¿o tal vez me estoy equivocando y era otro usuario quien lo preguntó?.

Saludos!








Lekim

Hola de nuevo

Si jaja,  pero al final no lo instalé y como es lógico no tengo esa funcionalidad disponible, así como supongo muchos usuarios.

Si que está en mi PC con W7 de 64bits con vb2012 de 64bits y la versión que estoy usando aquí es  vb2010.

De todos modos tampoco es tanto código y puede ser de utilidad y ejemplo.

Sl2s.

Eleкtro

#3
Cita de: Lekim en 23 Febrero 2016, 17:35 PM
Hola de nuevo

Si jaja,  pero al final no lo instalé y como es lógico no tengo esa funcionalidad disponible, así como supongo muchos usuarios.

Si que está en mi PC con W7 de 64bits con vb2012 de 64bits y la versión que estoy usando aquí es  vb2010.

De todos modos tampoco es tanto código y puede ser de utilidad y ejemplo.

Sl2s.

Hombre, no está tan claro si no aclaras desde un principio los motivos que te llevan a desarrollar "X" código, me diste a entender que programaste una función que simula a la de Microsoft sencillamente por que desconocias esa información,
lo siento por la equivocación.

Esto lo comento para quien no lo sepa:
- La class HttpUtility no se encuentra disponible en el perfil cliente de .Net Framework (al ser unos runtimes compactos y limitados),
  la solución sería instalar el perfil completo de los runtimes de .Net Framework y compilar bajo ese .NetFx objetivo en Visual Studio.

Saludos!