Foros del Web » Programando para Internet » PHP »

Problema raro con acentos en servidor local

Estas en el tema de Problema raro con acentos en servidor local en el foro de PHP en Foros del Web. De antemano muchas gracias por la ayuda que me puedan brindar. El problema que tengo tiene que ver exclusivamente con el servidor local, utilizo WAMP ...
  #1 (permalink)  
Antiguo 06/02/2014, 13:13
 
Fecha de Ingreso: octubre-2012
Ubicación: Talcahuano
Mensajes: 4
Antigüedad: 11 años, 6 meses
Puntos: 1
Pregunta Problema raro con acentos en servidor local

De antemano muchas gracias por la ayuda que me puedan brindar.

El problema que tengo tiene que ver exclusivamente con el servidor local, utilizo WAMP v2.0. No lo he querido actualizar a una versión más reciente porque me ha funcionado bien.

Lo que ocurre es exclusivamente en el servidor local porque en el servidor web funciona normalmente.

Al utilizar la siguiente función php es donde se presenta el problema:

Código PHP:
function amigables($url) {

   
// Tranformamos todo a minusculas
   
$url        =   strtolower($url);
                
   
// Cambiamos los caracteres especiales latinos
   
$acentos = array("á","é","í","ó","ú","Á","É","Í","Ó","Ú","ñ","Ñ");
   
$normal = array("a","e","i","o","u","a","e","i","o","u","n","n");
   
$url str_replace($acentos$normal$url);

   
// Ahora cambiamos algunos otros caracteres especiales y códigos por un guión
   
$find = array(' ''&''\r\n''\n''+');
   
$url str_replace ($find'-'$url);

   
// Se eliminan los siguientes caracteres que en una URL no nos interesan
   
$order = array('°','.',"'",'"',':','@','#','$','%','&','/','=','?','¡','¿','!','[',']','{','}',')','(',',');
   
$replace "";
   
$url str_replace($order$replace$url);
                
   return 
$url;

Si utilizo esta función en el servidor local la url amigable me queda algo como esto

http://127.0.0.1/aqu��-est��-el-ejemplo


Si todo hubiera salido bien tendría que verse como http://127.0.0.1/aqui-esta-el-ejemplo

Esto no ocurre si utilizo esta función en un servidor vía web.

Algunos detalles a tener en cuenta:
  1. La codificación de caracteres definida en el php.ini es UTF-8 ... default_charset = "UTF-8"
  2. En Apache también se definio UTF-8 como codificación por defecto... AddDefaultCharset UTF-8
  3. Los archivos php todos están guardados con codificación UTF-8 NO BOM
  4. Todas las cabeceras de las páginas están en UTF-8
  5. La base de datos y sus respectivas tablas están en utf8_spanish_ci
  6. Luego de la conexión a la base de datos se definió mysql_set_charset('utf8')
  7. Versión de Apache 2.2.8
  8. Versión de PHP 5.2.6

Luego de todo lo indicado... ¿Alguien tendrá una idea de lo que está ocurriendo?
¿Habrá algún problema con str_replace al trabajar en el servidor local?

Agradezco toda la ayuda que me puedan brindar.
  #2 (permalink)  
Antiguo 06/02/2014, 13:47
 
Fecha de Ingreso: octubre-2012
Ubicación: Talcahuano
Mensajes: 4
Antigüedad: 11 años, 6 meses
Puntos: 1
Respuesta: Problema raro con acentos en servidor local

Encontré una solución parche, pero acepto sugerencias si hay algo definitivo para resolver mi problema.

Al aplicar utf8_encode a la variable $url me dejó con algunos caracteres raros mi cadena. De esa manera averigüé cuál caracter raro corresponde a cada vocal con acento y asunto resuelto:

á = ã¡
é = ã©
í = ã*
ó = ã³
ú = ãº
ñ = ã±

Pero solo funciona con cadenas que estén completamente en minúsculas.

De esta manera el resultado final de la función quedaría así...

Código PHP:
function amigables($url) {

   
// Tranformamos todo a minusculas
   
$url strtolower($url);
                
   
// Cambiamos los caracteres especiales latinos
   
$acentos = array("á","é","í","ó","ú","ñ");
   
$normal = array("a","e","i","o","u","n");
   
$url str_replace($acentos$normal$url);
        
    
// Convierto la cadena a utf8
   
$url utf8_encode($url);
        
   
//Rememplazamos caracteres especiales
   
$especiales = array("ã¡","ã©","ã*","ã³","ãº","ã±");
   
$normal = array("a","e","i","o","u","n");
   
$url str_replace($especiales$normal$url);

   
// Ahora cambiamos algunos otros caracteres especiales y códigos por un guión
   
$find = array(' ''&''\r\n''\n''+');
   
$url str_replace ($find'-'$url);

   
// Se eliminan los siguientes caracteres que en una URL no nos interesan
   
$order = array('°','.',"'",'"',':','@','#','$','%','&','/','=','?','¡','¿','!','[',']','{','}',')','(',',');
   
$replace "";
   
$url str_replace($order$replace$url);
                
   return 
$url;

Como les dije, si alguien sabe de alguna solución definitiva agradezco los comentarios.
  #3 (permalink)  
Antiguo 07/02/2014, 09:34
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: Problema raro con acentos en servidor local

Hola, en mi caso para crear una URL para SEO, suelo usar esta función, espero te sirva.

Código PHP:
Ver original
  1. function sanear_string($toClean) {
  2.     $chars = array(
  3.         'Š' => 'S', 'š' => 's', 'Ð' => 'Dj','Ž' => 'Z', 'ž' => 'z', 'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'A',
  4.         'Å' => 'A', 'Æ' => 'A', 'Ç' => 'C', 'È' => 'E', 'É' => 'E', 'Ê' => 'E', 'Ë' => 'E', 'Ì' => 'I', 'Í' => 'I', 'Î' => 'I',
  5.         'Ï' => 'I', 'Ñ' => 'N', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O', 'Ö' => 'O', 'Ø' => 'O', 'Ù' => 'U', 'Ú' => 'U',
  6.         'Û' => 'U', 'Ü' => 'U', 'Ý' => 'Y', 'Þ' => 'B', 'ß' => 'Ss','à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a', 'ä' => 'a',
  7.         'å' => 'a', 'æ' => 'a', 'ç' => 'c', 'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e', 'ì' => 'i', 'í' => 'i', 'î' => 'i',
  8.         'ï' => 'i', 'ð' => 'o', 'ñ' => 'n', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o', 'ö' => 'o', 'ø' => 'o', 'ù' => 'u',
  9.         'ú' => 'u', 'û' => 'u', 'ý' => 'y', 'ý' => 'y', 'þ' => 'b', 'ÿ' => 'y', 'ƒ' => 'f', ',' => '',  '.' => '',  ':' => '',
  10.         ';' => '',  '_' => '',  '<' => '',  '>' => '',  '\\'=> '',  'ª' => '',  'º' => '',  '!' => '',  '|' => '',  '"' => '',
  11.         '@' => '',  '·' => '',  '#' => '',  '$' => '',  '~' => '',  '%' => '',  '€' => '',  '&' => '',  '¬' => '',  '/' => '',
  12.         '(' => '',  ')' => '',  '=' => '',  '?' => '',  '\''=> '',  '¿' => '',  '¡' => '',  '`' => '',  '+' => '',  '´' => '',
  13.         'ç' => '',  '^' => '',  '*' => '',  '¨' => '',  'Ç' => '',  '[' => '',  ']' => '',  '{' => '',  '}' => '',  ' '=> '-',
  14.     );
  15.  
  16.     $toClean = str_replace('&', '-and-', $toClean);
  17.     $toClean = str_replace('.', '', $toClean);
  18.     $toClean = strtolower(strtr($toClean, $chars));
  19.     $toClean = str_replace(' ', '-', $toClean);
  20.     $toClean = str_replace('--', '-', $toClean);
  21.     $toClean = str_replace('--', '-', $toClean);
  22.     $toClean = preg_replace('/[^\w\d_ -]/si', '', $toClean);
  23.     return trim($toClean);
  24. }

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.

Etiquetas: acentos, caracteres, charset, codificacion, especiales, wamp, wampserver
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:35.