Ver Mensaje Individual
  #3 (permalink)  
Antiguo 09/10/2007, 11:24
Avatar de PosProdukcion
PosProdukcion
 
Fecha de Ingreso: noviembre-2004
Ubicación: Manzanares el Real (Madrid)
Mensajes: 726
Antigüedad: 19 años, 6 meses
Puntos: 9
Re: server.htmlencode y server.urlencode

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:
  1. Mostrarlo tal cual, con lo que los caracteres <, >, ", & pueden provocar errores mezclados con el HTML
  2. Utlizar Server.HTMLEncode(texto), sería lo suyo pero codifica mal las tildes y eñes, según se dice aquí y aquí
  3. 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 &amp; &lt;COCÓ&gt; (escrito con tildes a pelo)</h3>
    <h3>El ca&ntilde;&oacute;n de Navarone &amp; &lt;COC&Oacute;&gt;  (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&iacute;!">
    </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