Mostrando entradas con la etiqueta caracteres. Mostrar todas las entradas
Mostrando entradas con la etiqueta caracteres. Mostrar todas las entradas

martes, 19 de julio de 2016

Codificación de caracteres (charset) en una BD Oracle

Necesitaba saber cuál es el CHARSET que se está utilizando en una BD Oracle. Con la sentencia

SELECT * FROM NLS_DATABASE_PARAMETERS;

podremos saber no sólo la codificación, sino otros parámetros interesantes como el idioma, los separadores decimales y de miles, el formato de fecha y hora, la versión de la BD, el símbolo de moneda y algunas cosas más...


jueves, 29 de enero de 2015

Contar frecuencia de palabras en un texto (versión 2) sin distinguir mayúsculas de minúsculas

Como complemento a la publicación de hace unos días, en la que contaba cómo contar cuántas veces aparece cada palabra en un fichero de texto, aquí podemos ver otra versión en la que se utilizan las "clases" (categorías de caracteres) definidas en el comando "tr", cuyos nombres son bastante intuitivos.  

Fig. 1. A ver quién tiene redaños a contar las palabras en este texto,
un evangelio alemán del s. XV

No es una mejora espectacular respecto a la opción de especificar los caracteres por rangos o individualmente (aquí sí es significativa la mejora), pero al menos así uno está seguro de que no se deja fuera un signo de puntuación si establece la categoría :punct:, por poner un ejemplo.

El código:

cat palabras.txt | tr [:punct:][:blank:][:digit:] "\n" | tr [:upper:] [:lower:] | sort | uniq -c | sort -nr > resul.txt

Una mejora añadida a esta versión es que no distingue entre mayúsculas y minúsculas, lo que he conseguido con la segunda invocación al comando "tr" que, como se puede ver, transforma todas las mayúsculas ([:upper:]) en minúsculas ([:lower:]).

Las categorías admisibles en el comando "tr" son (al menos en la versión de tr que tengo en mi máquina Windows actual):

 Fig. 2. Clases (categorías) de caracteres en el comando tr


Aquí está el enlace a la versión anterior, donde está explicado un poco más detallado el código
http://cosicasdeinformatica.blogspot.com.es/2015/01/contar-frecuencia-de-palabras-en-un.html

martes, 4 de junio de 2013

Codificación de caracteres en páginas web

Las codificaciones de caracteres son un quebradero de cabeza. Cuando hago una página web y al abrirla en un navegador empiezo a ver caracteres "extraños", me da mucha rabia. Sobre todo, porque demuestra que algo se está haciendo mal, y normalmente suelo ser yo, y no el ordenador, quien se está equivocando.

Fig. 1. ¡Qué rabia me dan estas cosas! ¡Y qué impresión más cutre da uno como programador!

¿Qué codificación hay que utilizar: UTF-8, ASCII, CP-1252, ISO-8859-1, ISO-8859-15...? Esto es para volverse loco. O para comerse las cerillas, que diría Llopis.

Preguntando a la autoridad en esta materia, el World Wide Web Consortium (W3C), esta es la cuestión (ver http://www.w3.org/International/questions/qa-choosing-encodings.es.php, cuya lectura os recomiendo encarecidamente, es muy reveladora).

y un poco más abajo dan la respuesta



Lo mejor es configurar el editor con el que se está trabajando para que todos los documentos se generen con esta codificación. En mi caso, últimamente estoy trabajando con el editor Komodo, para PHP. Esto se codifica aquí:

Edit / Preferences

También hay que tener cuidado, ya que aparte de la configuración genérica (para todos los ficheros), también se puede establecer una configuración específica para un fichero individual, el fichero actual. Esto se puede comprobar en el menú Edit / Current File Settings

Y se configura en esta pantalla


A veces, no basta sólo con esto. También es importante añadir la cabecera META adecuada a la página. En el ejemplo de la página mostrada arriba (la de la contraseña), la ñ se visualizaba erróneamente a pesar de estar codificada en UTF-8, y de que el navegador me la reconociera como tal (lo que se puede comprobar en el menú Ver / Codificación, tanto en IE como en Firefox, aunque esto puede tener pequeñas variaciones dependiendo del navegador y su versión)


¿Qué faltaba, pues? Pues faltaba añadir en la sección <head> esta etiqueta

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

Una vez añadida, ahora ya se ve bien.

Si la página no es HTML, sino que se genera, por ejemplo, un Excel, hay que añadir la cabecera pero cambiando el atributo "content" en función del tipo de contenido. Por ejemplo, generando un XLS con PHP, hay que añadir:

header("Content-type: application/vnd.ms-excel charset=utf-8");

Conclusión: como dice el W3C, SIEMPRE QUE SEA POSIBLE, USE UTF-8. (Pero no te olvides de la etiqueta META correspondiente).

Por supuesto, esta es la respuesta simple. Hay que considerar otros casos particulares, como por ejemplo, tener que mostrar datos de una base de datos que no está en UTF-8. En ese caso, a lo mejor conviene cambiar la codificación de esa página en concreto, o bien convertir los resultados utilizando las funciones de conversión entre codificaciones.

Yo tengo ahora mismo ese problema. En la misma página (codificada en UTF-8, y con el META correspondiente) tengo que mostrar información procedente de diferentes bases de datos. Claro, con unos registros se me muestran bien las tildes y con otros no.


¿Será por el origen de la información, que viene de diferentes bases de datos? En efecto, parece ser que esa es la causa. Las BD están codificadas con diferentes codificaciones. Para resolver esto, o sea, para convertir a UTF-8 datos que no están en dicha codificación, tenemos en PHP la función utf_encode. En mi caso, usarla consiste en cambiar, donde dice

$s1=odbc_result($rs,"s1");

debe decir

$s1=utf8_encode(odbc_result($rs,"s1"));

Una vez hecho, ya se ven bien los resultados:

Bueno, estoy seguro de que voy a tener que seguir peleándome un poco con las codificaciones, pero obligarme a escribir esto me ha hecho comprender mucho más claro el problema y las soluciones.

¡Feliz programación!

Related Posts Plugin for WordPress, Blogger...