iphone - open - uiwebview tutorial
¿Cómo cambiar la codificación de caracteres en UIWebView? (2)
Esto es lo que hago,
primero averigüe si es texto, si lo es, obtengo los datos, establezco la codificación y la UIWebView>loadData:MIMEType:textEncodingName:baseURL
utilizando UIWebView>loadData:MIMEType:textEncodingName:baseURL
.
Aquí está el código:
Obtenga el MIMEType enviando una solicitud HEAD síncrona.
Queremos usar una solicitud HEAD HTTP que generalmente es lo suficientemente rápida .
Y queremos hacer la solicitud de forma sincrónica por dos razones, necesitamos el resultado de la solicitud para continuar, y queremos evitar problemas de solicitud concurrentes como este .NSMutableURLRequest *headRequest = [NSMutableURLRequest requestWithURL:url]; [headRequest setHTTPMethod:@"HEAD"]; NSHTTPURLResponse *headResponse; NSError *error = nil; [NSURLConnection sendSynchronousRequest:headRequest returningResponse:&headResponse error:&error]; if (error != nil) { NSLog(@"loadURLWithString %@",[error localizedDescription]); } NSString *mimeType = [headResponse MIMEType];
Luego, si es texto, cárguelo con UIWebView>loadData:MIMEType:textEncodingName:baseURL
Para mantener la aplicación receptiva, se recomienda colocar el siguiente código en un bloque y ejecutarlo dentro de una cola GCD .if([mimeType rangeOfString:@"text" options:NSCaseInsensitiveSearch].location == 0) { [wview loadData:[NSData dataWithContentsOfURL: url] MIMEType:mimeType textEncodingName:encoding baseURL:nil];
Resumen del problema: cuando navega por sitios que no están en inglés y no especifica explícitamente la codificación de caracteres correcta con UIWebView en iOS, la página no se puede mostrar correctamente.
Explicación detallada: como el método loadRequest:
en UIWebView usará la codificación especificada en el encabezado del conjunto de caracteres enviado desde el servidor web o el conjunto de caracteres escrito en la metaetiqueta HTML, y de forma predeterminada es iso-8859-1 (bueno, no estoy muy seguro sobre esto) cuando no se especifica charset, lo que causa que los sitios que no están en inglés no se puedan mostrar correctamente.
He intentado en Google una forma de cambiar el conjunto de caracteres que utiliza UIWebView, pero la única forma es usar el loadData:MIMEType:textEncodingName:baseURL:
para especificar el nombre de la codificación.
Sin embargo, no es una buena idea usar loadData:MIMEType:textEncodingName:baseURL:
+ NSURLConnection en lugar de loadRequest:
porque UIWebView no llamará al método delegado webView:shouldStartLoadWithRequest:navigationType:
for frames, e incluso si encontramos una forma para recibir una notificación cuando UIWebView cargue un marco, no podemos llamar a loadData:MIMEType:textEncodingName:baseURL:
para cargar el contenido del marco, ya que cargará el marco como la página exterior si lo hacemos.
Además, he intentado usar un hack de javascript, pero parece que la propiedad es de solo lectura y no se puede cambiar.
[webView stringByEvaluatingJavaScriptFromString:@"document.characterSet=''utf-8'';"];
Otra solución es insertar una etiqueta meta en el HTML y pedir a UIWebView que cargue el código modificado, pero el problema del marco mencionado anteriormente también se aplica aquí.
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
Pregunta: ¿Existe alguna solución mejor que pueda cambiar la codificación de caracteres en una página web cargada en UIWebView y manejar los marcos correctamente?
Puede hacerlo cargando manualmente el HTML, modificándolo y luego cargando el contenido modificado en el UIWebView.
- cargar manualmente el HTML desde la página que no incluye la metaetiqueta, en una cadena (por ejemplo, usar
NSURLConnection
) - utilizando la manipulación de cadenas, inserte su metaetiqueta de codificación apropiada en el HTML cargado manualmente
- establezca el HTML en su vista web a la cadena modificada usando
loadHTMLString:
Ahora, esto funcionará bien para una página web que no contiene enlaces. Si contiene enlaces, verá que después de que hagan clic en un enlace, la nueva página no tendrá su modificación en su lugar. Por lo tanto, deberá interceptar manualmente todos los clics. Así es como puedes hacer eso:
- Implementar un delegado UIWebView
- Implementar el método webView:shouldStartLoadWithRequest:navigationType:
- En su método de delegado, cargue la URL manualmente y modifique el contenido antes de configurarlo en UIWebView, como se muestra arriba.