2011-11-16 21 views
5

estoy usando CodeIgniter no durante tanto tiempo pero he algunos problemas charset .. voy preguntando en el Foro de CI, pero yo quiero ir más lejos, todavía no hay solución global: http://codeigniter.com/forums/viewthread/204409/CodeIgniter y juegos de caracteres

El problema fue un error de base de datos 1064. Tengo una solución, ¡use iconv! Funciona bien, pero creo que no es necesario. Estoy buscando mucho en Internet para charset, etc. pero estoy usando CI ahora, ¿qué hay de conjuntos de caracteres y CI?

Así que tengo muchas preguntas al respecto, espero que alguien pueda dejarlo claro para mí:

¿Cuál es la mejor manera de establecer el conjunto de caracteres global? ¿Y qué poner?

  • En la cabeza

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

  • En config/config.php

    $config['charset'] = 'UTF-8';

  • En config/database.php

    $db['default']['char_set'] = 'utf8';

    $db['default']['dbcollat'] = 'utf8_general_ci';

  • En .htaccess, mis reglas de reescritura y

    php_value magic_quotes_gpc Off

    AddDefaultCharset UTF-8

  • también necesita enviar una cabecera? ¿Dónde colocar? ¿Algo como?

    header('Content-Type: text/html; charset=UTF-8');

  • En mi editor (Notepad ++) guardar archivos como UTF-8? ¿O UTF-8 (sin BOM)? ¿O es bueno ANSI (esto es lo que estoy usando ahora)?

  • Utilice utf8_unicode_ci o utf8_general_ci para la base de datos MySQL? ¿Y por qué?

  • ¿Qué tal leer feeds RSS, cómo manejar múltiples conjuntos de caracteres? Donde estoy trabajando tengo dos fuentes, una con codificación UTF-8 y la otra con ISO-8859-1. Esto se almacenará en la base de datos y se comparará a veces para ver si hay nuevos elementos. Falla en caracteres especiales.

estoy trabajando con: - IC 2.0.3 - PHP 5.2.17 - MySQL 5.1.58

Más información añadida:

Modelo:

function update_favorite($data) 
{ 
$this->db->where('id', $data['id']); 
$this->db->where('user_id', $data['user_id']); 
$this->db->update('favorites', $data); 
return; 
} 

controlador:

$this->favorites_model->update_favorite(array(
'id' => $id, 
'rss_last' => $rss_last, 
'user_id' => $this->session->userdata('user_id') 
)); 

Cuando $ rss_last es un valor “normal” como: “prueba” (sin comillas) funciona bien. Cuando se trata de un valor de más de longitud similar (en holandés): el malware vindt F-Secure se reunió Certificado de Maleisische overheid

consigo este error:

Error Number: 1064

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘vindt malware met certificaat van Maleisische overheid, user_id = ‘1’ WHERE `i’ at line 1

UPDATE favorites SET id = ‘15’, rss_last = F-Secure vindt malware met certificaat van Maleisische overheid, user_id = ‘1’ WHERE id = ‘15’ AND user_id = ‘1’

Filename: /home/.../domains/....nl/public_html/new/models/favorites_model.php

Line Number: 35

Alguien en el foro CI me dijo que usara este :

'rss_last' => iconv("UTF-8", "UTF-8//TRANSLIT", $rss_last) 

esto funciona bien, pero creo que esto no es necesario ..

El valor $ rss_last salió un canal RSS, según lo dicho BEF mineral, a veces un UTF-8 y otras veces a la codificación ISO-8859-1:

$rss = file_get_contents('http://www.website.com/rss.xml'); 
$feed = new SimpleXmlElement($rss); 
$rss_last = $feed->channel->item[0]->title; 

Parece que esta última parte es el problema, cuando $ rss_last se establece en el valor que funciona bien:

$rss_last = 'F-Secure vindt malware met certificaat van Maleisische overheid'; 

Cuando el valor salió de la RSS se dan problemas ...

Algunas preguntas más ..

acaba de encontrar esto: Detect encoding and make everything UTF-8

¿La mejor solución? Pero .. es iconv no más simple, hacer algo como esto:

$encoding = some_function_to_get_encoding_from_feed($feed); 
$rss_last = iconv($encoding, "UTF-8//TRANSLIT", $feed->channel->item[0]->title); 

Pero lo que para usar de "some_function_to_get_encoding_from_feed"? mb_detect_encoding?

Y mb_convert_encoding vs iconv?

+0

Para su agregado: en su función de actualización de SQL, todos los parámetros están entre comillas excepto _rss_last_. Sí, sé que fue generado por CI, pero esto es sospechoso. –

+0

_Esto funciona bien, pero creo que esto no es necesario .._ Su derecho. –

Respuesta

4

1) No hay una solución global.

2)

AddDefaultCharset UTF-8 

se necesita para la respuesta a Apache cliente con codificación correcta. Hazlo.

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

no necesariamente, pero recomendado por W3C.

$config['charset'] = 'UTF-8'; 

es deseable

$db['default']['char_set'] = 'utf8'; 
$db['default']['dbcollat'] = 'utf8_general_ci'; 

de codificación para la conexión a la base de datos de CI. Si la codificación de su base de datos es UTF-8, hágalo obligatorio.

header('Content-Type: text/html; charset=UTF-8'); 

No haga esto a menos que sea necesario. Charset ya indicado en el código HTML y .htaccess.

Use utf8_unicode_ci or utf8_general_ci for the MySQL database? And why? 

Para su propio idioma (ruso), utilizo utf8_general_ci.

In my editor (Notepad++) save files as UTF-8? 

¡Absolutamente! Todo el código que Apache proporcionará como UTF8 debería estar en UTF8.

How about reading RSS feeds, how to handle multiple charsets? 

Si usted tiene cada uno de RSS en cada mesa - charset puede especificar para cada tabla y establecer la codificación correcta con cada consulta SQL. Sí, los símbolos cirílicos, por ejemplo, fallarán en dispositivos que no sean UTF8.

+0

Agregaría que es obligatorio: codificación en .htaccess y todos los archivos html guardados como UTF-8 para HTML y $ db ['default'] ['dbcollat'] = 'utf8_general_ci'; para MYSQL. –

+0

¡Gracias por responder! Acabo de agregar más información sobre la lectura de los canales RSS en mi publicación de inicio. – Roy

1

UTF-8 (sin BOM) debería darle los mejores resultados según su configuración y no hay necesidad de enviar encabezados separados ya que la codificación ya está seleccionada en la parte del encabezado. Utf8_general_ci debería funcionar bien para la base de datos MySQL. ¿Quizás las entradas en la base de datos no son válidas?

+0

Controlado y cambiado, pero no hace ninguna diferencia. Todavía necesito poner el ícono 'iconv (" UTF-8 "," UTF-8 // TRANSLIT ", $ value)' antes de usar en una consulta, de lo contrario recibo el error de la base de datos 1064 ... Las entradas en la base de datos no son válidas ? Todo tiene la intercalación utf8_general_ci .. – Roy

+0

1) ¿Puede darme el error de base de datos completo aquí? 2) Quise decir que tal vez las entradas no eran utf-8 cuando se insertaron. 3) Tal vez debería actualizar PHP a 5.3.x - hace un par de semanas un amigo tenía problemas (ligeramente diferentes) con el DB usando CI2 y una versión anterior de PHP. Nada de lo que probó funcionó ... luego actualizó PHP y todo estaba bien de repente ... extraño error. Pero este debería ser tu último recurso. – Shomz

+0

Acabo de agregar más información y le pediré a mi proveedor de alojamiento que actualice. – Roy

Cuestiones relacionadas