2008-12-11 15 views
8

Al analizar HTML para determinadas páginas web (en particular, cualquier página de Windows en vivo) encuentro muchas URL en el siguiente formato.Encontrar una API de análisis para URL con codificación parcialmente utf8

http \ X3A \ x2f \ x2fjs.wlxrs.com \ x2fjt6xQREgnzkhGufPqwcJjg \ x2fempty.htm

Estos parecen ser parcialmente UTF8 escapó cuerdas (\ x2f = /, \ X3A = :, etc ...). ¿Hay una API .Net que se pueda usar para transformar estas cadenas en System.Uri? Parece bastante fácil de analizar pero estoy tratando de evitar construir una rueda nueva hoy.

+0

FYI. tenga en cuenta que pegar esta url como cadena en la consola del navegador proporcionará la salida correcta. (no real pero FYI) http://i.stack.imgur.com/2md5D.jpg –

+0

y aquí está la herramienta en línea para jugar con él ... http: //www.javascriptobfuscator.com/Default.aspx –

Respuesta

3

Lo que ha publicado no es HTTP válido. Como tal, por supuesto HttpUtility.UrlDecode() no funcionará. Pero independientemente de eso, se puede convertir esta de nuevo en texto normal como esto:

string input = @"http\x3a\x2f\x2fjs.wlxrs.com\x2fjt6xQREgnzkhGufPqwcJjg\x2fempty.htm"; 
string output = Regex.Replace(input, @"\\x([0-9a-f][0-9a-f])", 
    m => ((char) int.Parse(m.Groups[1].Value, NumberStyles.HexNumber)).ToString()); 

notar que esto supone que la codificación es América-1 en lugar de UTF-8. La información que proporcionó no es concluyente a ese respecto. Si necesita UTF-8 para funcionar, necesita una ruta un poco más larga; tendrá que convertir la cadena en bytes y reemplazar las secuencias de escape con los bytes relevantes en el proceso (probablemente necesite un bucle while), y luego usar Encoding.UTF8.GetString() en la matriz de bytes resultante.

+0

¿Qué quiere decir _UTF-8 para trabajar_? él tiene una cadena que es unicode por defecto. ¿puedes explicar? (p.s. +1) –

+1

@RoyiNamir: Su ejemplo solo incluye caracteres ASCII. No está claro cómo espera que codifiquen caracteres que no sean ASCII, digamos 'á'. Si está codificado como '\ xe1', entonces es Latin-1 (no Unicode). Si está codificado como '\ xc3 \ xa1', entonces es UTF-8, lo que significa que se utilizan varios bytes para codificar un solo carácter. Dado que su codificación parece asumir dos dígitos hexadecimales después del '\ x', no puede usar UTF-16 o UTF-32. – Timwi

+0

si escribo en la consola '\ xe1', ¿Representa un carácter unicode o una codificación utf8? ¿cómo lo maneja js? –

0

aquí es otra solución: (como continuación de la solución @timwi)

string output = Regex.Replace(input, @"\\x([0-9a-f][0-9a-f])", 
      m => ((char)Convert.ToInt32(m.Groups[1].Value, 16)).ToString()); 
Cuestiones relacionadas