Después de investigar un poco más, no he dado con una solución al problema de
Server.HTMLEncode() con
charset=utf-8
Al recoger texto de un textarea, este texto se recoge sin problemas aunque contenga eñes, tildes o caracteres <, >, ", &, etc. El problema viene cuando se quiere mostrar ese texto dentro de una página html o se quiere grabar en una bd
Si se quiere mostrar este texto dentro del codigo HTML
manteniendo el UTF-8 hay varias opciones no buenas:
- Mostrarlo tal cual, con lo que los caracteres <, >, ", & pueden provocar errores mezclados con el HTML
- Utlizar Server.HTMLEncode(texto), sería lo suyo pero codifica mal las tildes y eñes, según se dice aquí y aquí
- No codificar y hacerte tu propia función apra sustituir <, >, ", & y alguno más que seguro me olvido (tal vez la mejor solución sin cambiar el charset)
La otra opción es usar
charset=ISO-8859-1 en la página que se usa el
HTMLEncode, que funciona bien para Server.HTMLEncode(texto), PERO tiene el inconveniente de que te obliga a escribir cada tilde o eñe con la notación "acute" como
& o a c u t e ;, incluidos los rótulos y mensajes que tengas en tu html. Yo he probado a mostrar el texto codificado en ISO-8859-1 en páginas UTF-8 y parece que funciona bien (no he probado muy a fondo)
Cambiar la propiedad
Response.charset o
Session.codepage no es solución, hasta donde yo he podido comprobar.
Aquí hablan del codepage pero a mí no me ha solucionado gran cosa...
Yo voto por la solución 3 (tu propia función + utf-8) o la de cambiar a iso-8859-1
sólo en la página donde se usa HTMLEncode
Aquí tienes un script para probar, tiene un textarea donde introducir texto con tildes, eñes y <, >, etc... Para probarlo cambia el charset marcado en rojo entre UTF-8 e ISO-8859-1...
Código:
<%@ Language=VBScript %>
<%option explicit
Response.Buffer=true%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="sp">
<title></title>
<link rel="stylesheet" type="text/css" href="backoffice.css">
</head>
<body>
<h3>El cañón de Navarone & <COCÓ> (escrito con tildes a pelo)</h3>
<h3>El cañón de Navarone & <COCÓ> (escrito con cod. "acute")</h3>
<%
Dim texto, charS
texto = Request.form("texto")
If texto <> "" Then
Response.write(texto)
Response.write(" <b><- sin encode <br /> con encode -></b> ")
Response.write(Server.HTMLEncode(texto))
Response.write("<br />")
End If
Response.write ("charset=" & Response.Charset & "<br />")
Response.write ("codepage=" & Response.Codepage & "<br />")
%>
<form name="frmPrueba" action="_prueba.asp" method="post">
<textarea name="texto" rows="10" cols="10"><%=texto%></textarea><br />
<input type="submit" value="Apretá aquí!">
</form>
</body>
</html>
Esto es a la conclusión que he lelgao haciendo estas pruebas y leyendo un poco, teniendo en cuenta que no soy ningún experto, así que no lo tomes como definitivo y pruébalo bien...
EDITO: Por cierto, este mensaje está relacionado con este
otro, por si no encontráis mucha relación con la pregunta