Ver Mensaje Individual
  #23 (permalink)  
Antiguo 28/07/2008, 07:23
furoya
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 21 años, 5 meses
Puntos: 317
Respuesta: Caracteres especiales en Javascript

No entiendo de AJAX, pero no se ve como una mala solución, mgusdl, se parece a la que usaste en el ejemplo anterior.

Cita:
Código:
txta.value.replace('€', 'EUR');
Aproveché que levantaste el tema para leerlo un poco. Me parece que el asunto está resuelto, pero no se nota. Si nadie se enoja, trato de acomodar un poco la información y de redondear algunos detalles.

En realidad, la codificación de la página no siempre depende de nosotros. Debería coincidir con la que use el servidor, y después con la que use el navegador. Esto último es más fácil porque algunos tienen la opción "Automático"; que me parece lee el meta, no creo que revise letra por letra del source.
Por eso hay desarrolladores que adhieren al UTF-8, pero si desde el host la mandan distinto, sus 'caracteres altos' no van a aparecer, y tendrán que ajustar su charset.

Por otro lado, y como dijo derkenuke, una cosa es la página web y otra los mensajes modales; por eso no andan las entities ni los ASCII o Unicode en un alert. Aunque no en todos los casos es así. En JS no existen los códigos "ayudamemoria", pero sí los valores decimales y hexadecimales para caracteres, con una sintaxis diferente.

Vamos a dejar este asunto por un momento para aclarar otro punto. Los caracteres se ven si existe una fuente instalada que los contenga. Quiero decir, que nosotros podemos proponer en CSS una fuente, pero si no está en la máquina de quien mira la página, será reemplazada por la que tenga configurada como default, y que puede no ser parecida ni llegar hasta ese caracter. En algún caso, habrá una lista (en un archivo por ahí del navegador o del sistema operativo) que proponga unas fuentes de reemplazo (según el criterio de 'parecidos' que tenga quien la hizo); o se usará una como recurso para "ponerla al final" de nuestro CSS. Esto es lo que hacen (masomenos) Internet Explorer / Windows en sus últimas versiones. Hay una fuente llamada 'Arial Unicode MS' que es una de las más completas; y el IE la toma cuando algún caracter no aparece en la que tiene declarada la hoja de estilos.

Firefox hace algo parecido, pero debe buscar en más fuentes, porque muestra varios caracteres que no están en 'A U MS'.

Bien, volviendo a los mensajes modales, en Mozilla casi todo está hecho en CSS, así que los mensajes se van a manejar con los mismos recursos del navegador. Y es muy probable que no haya problemas para mostrar un (euro). Pero en IExplorer... . Allí los mensajes son objetos, y su configuración depende del sistema operativo.

Botón secundario en escritorio → Propiedades → apariencia → Avanzadas

Por supuesto que estos valores se pueden leer desde el CSS (Menu, MenuText, message-box) para aplicarlos a un documento web o en una capa a modo de mensaje, y como dije más arriba, si no se encuentra un caracter, se lo reemplaza por el de otra fuente. Pero cuando el cartelito no es CSS estamos en problemas, la única manera de verlo correctamente es entrar en la configuración del SO para cambiar la fuente. Desde la página web no se puede hacer nada.
Si están usando uno en inglés, o alguna vez eligieron un Tema que venía con sus propias fuentes y no estaba en 'español'; es probable que tengan una letra muy linda para ver en la barra de títulos o en los mensajes, pero que no alcance ni al código ANSI
Sugiero que cambien la fuente ya.


Ahora bien, sabemos que un entity no cabe en un JS, lo interpreta como una cadena de caracteres. Y que el lenguaje tiene una limitación natural para interpretar algunas letras (aún con el <script type="text/javascript" src="bla.js" charset="utf-8"></script>
que recomendó MaBoRaK ), así que provee un método para llegar al menos hasta el caracter 65536 en String. Como ya dijimos más arriba, se lo reemplaza por su código en decimal o hexadecimal; que no tendrán un nombre memotécnico, pero es lo que se usa.

En realidad, es también lo que se usa en HTML. Todos ya conocemos los ñ ó &#x00f1;. Las entities llaman a esos números.

Volviendo al JS, el ejemplo con

Código:
confirm(String.fromCharCode(191)+"Desea realmente eliminar el d"+String.fromCharCode(237)+"a seleccionado?")
se podría "automatizar" ya que no es necesario usar uno para cada letra : se pueden meter todas en un mismo String.fromCharCode(), aún las que no sea indispensable cambiar; total ¿quién se va a enterar?. Por supuesto, el mismo método vale para los formatos \x00 y \u0000 (Como hablaron del euro, puse 2 versiones del signo en el ejemplo).

Código:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<META http-equiv=Content-Type content="text/html; charset=utf-8">
<title></title>
<script type="text/javascript">

function aDec(){
var texto = document.getElementById("textoOrig").value;
var destr = texto.split("");
var codif = new Array();
var textoCod;

for (i=0; i<destr.length; i++){
var cadenaDec = destr[i].charCodeAt();
codif[i] = cadenaDec;
}

document.getElementById("textoFin").value = codif;
document.getElementById("codigo0").innerHTML = 
"String.fromCharCode(";
document.getElementById("codigo1").innerHTML = ")";
}

function aHexa(){
var texto = document.getElementById("textoOrig").value;
var destr = texto.split("");
var codif = new Array();

for (i=0; i<destr.length; i++){
var cadenaHexa = destr[i].charCodeAt().toString(16);

if (cadenaHexa.length < 4) {
var rellenoCeros = "0000".substring(0,4-cadenaHexa.length);
cadenaHexa = rellenoCeros.concat(cadenaHexa);
}

codif[i] = "\\u"+ cadenaHexa;
}

codifFin = codif.join("");
document.getElementById("textoFin").value = codifFin;
document.getElementById("codigo0").innerHTML = "alert(";
document.getElementById("codigo1").innerHTML = ")";
}

</script>
<style type="text/css">
body{color:#ffffff; background-color:#000000; font-weight:bold;}
#textoFin{font-family:monospace;}
</style>
</head>
<body>
<h2>Conversiones</h2>

<form>
<input type=text value="₠;€" id=textoOrig> Escriba el texto.<br>
<input type=button value="A decimal" onclick="aDec()"> 
<input type=button value="A hexadecimal" onclick="aHexa()"> <br>
<tt id="codigo0"></tt><input type=text value="" id=textoFin>
<tt id="codigo1"></tt> <br>

</form>

</body>
</html>
Ya que Anarko mencionó lo de

Cita:
...Es posible que JavaScript me devuelva &ntilde; cuando yo le envie una ñ ?...
digamos que no. Seguramente PHP lo hace, porque escribe páginas web, pero JS no —al menos, no necesariamente— y como ya vimos, tiene otras formas de convertir caracteres. Pero resulta que hay un truco para los que tienen que verse como tales y coinciden con los de etiquetas, como los paréntesis angulares.

Código:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<META http-equiv=Content-Type content="text/html; charset=utf-8">

<title>ENTITIES.</title>
</script>
<script language="JavaScript">
function convertir(){
var valorDest=document.frm.origen.innerHTML;
document.frm.destino.value = valorDest;
}

</script>
<style type="text/css">
body{color:#ffffff; background-color:#000000;}
</style>

</head>
<body>
<h2>Escriba un texto con par&eacute;ntesis angular y espacio de no separación.</h2>

<form name=frm>
<textarea name=origen cols=45><em>Ñ-ü**€₠</em></textarea> <br>
<input type=button value="Convertir a entity" 
onclick="convertir()" accesskey="-"> <br>
<textarea name=destino rows=3 cols=45 read¬only></textarea>
</form>

</body>
</html>
Esto sirve para meter código fuente en un pre.


Hace algún tiempo le conté a caricatos ( Hola!) que pensaba abrir un tema sobre fuentes y por qué unas se ven y otras no. Lo cierto es que hay suficientes mensajes desparramados como para enterarse, si es que alguien se toma el trabajo de leerlos. Así que me doy por satisfecho con mi modesta participación en este tema, y no abro más nada.

Lo que sí aprovecho es el espacio, y dejo un par de enlaces. Por supuesto, hay muchos otros.

Caracteres especiales, iExplorer y la madre que los parió

(caracteres especiales) acento simple...

predefinicion de codigo hexadecimal a mostrar en textarea

¿Qué codificación de caracteres es más conveniente usar?

Fuentes

Expresiones regulares