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.
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
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:
- System.Web.HttpUtility.UrlDecode() (https://msdn.microsoft.com/en-us/library/system.web.httputility.urldecode%28v=vs.110%29.aspx)
El código fuente de
Microsoft (para aprendizaje, o por simple curiosidad):
- System.Web/Util/HttpEncoder.cs: UrlDecode(string, Encoding) (http://referencesource.microsoft.com/System.Web/R/afac0d4e31f5382a.html)
Un ejemplo de uso:
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 (https://en.wikipedia.org/wiki/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!
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.
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!