2011-04-25 19 views
8

Estoy trabajando en un sitio multilingüe con CodeIgniter. Hay una forma de que los datos de mensajes al controlador, pero $_POST está vacía cuando comienzo a utilizar caracteres turcos como öçüÜĞ etc.

puedo configurar el juego de caracteres a:

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

Forma:

<form action="translations/save" method="post" accept-charset="utf-8"> 
    <textarea rows="6" cols="60" id="editor_tr" name="editor_tr">Türkçe</textarea> 
</form> 

$_POST y $this->input->post('editor_tr') devuelve vacío, pero puedo ver la publicación en bruto con file_get_contents("php://input").

Este funciona bien en una prueba PHP normal, pero no funciona con CodeIgniter. Tal vez mi archivo .htaccess está causando el problema, pero no sé.

Cualquier ayuda es muy apreciada.

ACTUALIZACIÓN: Aquí está la salida para var_dump según lo solicitado.

var_dump($_POST) - Sin caracteres turcos

array(3) { ["id"]=> string(12) "news8titleID" ["editor_tr"]=> string(13) "turkish value" ["editor_en"]=> string(13) "english value" } 

var_dump($_POST) - con caracteres turcos (La entrada era: Türkçe karakter, pero no aparece en el $ _POST)

array(3) { ["id"]=> string(12) "news8titleID" ["editor_tr"]=> string(0) "" ["editor_en"]=> string(13) "english value" } 

ACTUALIZACIÓN 2 : Al depurar, descubrí que la clase system.core.Input limpia los datos de entrada en la función _clean_input_data.

// Clean UTF-8 if supported 
if (UTF8_ENABLED === TRUE) 
{ 
    $str = $this->uni->clean_string($str); 
} 

Por lo tanto, antes de la $_POST ha llegado a mi controlador, el valor editor_tr está ya limpia por system.core.Utf8 clase en esta función:

function clean_string($str) 
{ 
    if ($this->_is_ascii($str) === FALSE) 
    { 
     $str = @iconv('UTF-8', 'UTF-8//IGNORE', $str); 
    } 

    return $str; 
} 
+0

¿Has probado mbstring? y la corrección asociada para [codeigniter] (http://www.haughin.com/2010/02/23/building-utf8-compatible-codeigniter-applications/) –

+0

'Mi archivo .htaccess tal vez está causando el problema, pero no sé .' ¿Considera proporcionarlo entonces? – Khez

+0

@Madmartigan Disculpa, fue un error tipográfico. – Ozay

Respuesta

6

Dado que los comentarios se acumulan y es probable que se pasen por alto, voy a publicar algunas sugerencias más.

Lectores, tenga en cuenta que se trata de valores de datos $ _POST y no visualización de datos en una página web.

Este usuario parece tener un problema similar:

Codeigniter seems to break $_POST of '£' character (Pound)

Hay un informe de aquí en Bitbucket de similar:

https://bitbucket.org/ellislab/codeigniter-reactor/issue/214/problem-when-inserting-special-characters : eliminados enlace: EllisLabs ha cerrado este repo para el público

Tal vez agregando esto a su index.php ayudará (probablemente no):

ini_set('default_charset', 'UTF-8');

cheque doble y asegúrese de que no está ejecutando ninguna validación o preparando normas en el campo. Cosas como url_title() quitarán esos caracteres.

+1

El primer enlace que diste resolvió el problema. Uf. No pensé que MAMP y PHP causarían esto, pero nunca se sabe. ¡Muchas gracias! – Ozay

+0

Es una gran noticia, gracias por ser tan receptivo y proporcionar los detalles pertinentes con prontitud. Buena suerte con su proyecto :) –

+0

Gracias Madmartigan, espero que esto ayude a otros que se encuentran con el mismo problema. – Ozay

-1

Éste no es una respuesta, pero es posible que desee tomar una mirar y ver cómo todo está entrando.


foreach($_POST as $key => $val) 
{ 
    $post_data[$key] => $val; 
} 
print_r($post_data); 

luego tratar con el poste de CI


foreach($_POST as $key => $val) 
{ 
    $post_data[$key] => $this->input->post($key); 
} 

print_r($post_data); 
6

Asegúrese de que la etiqueta de formulario tiene accept-charset:

<form method="post" action="" accept-charset="utf-8"> 

Luego, en el uso del controlador utf8_decode() se deben recuperar los valores publicados:

$value = utf8_decode($this->input->post('field_name')); 
+0

Esta debería ser la solución aceptada, o al menos upvoted más. La solución en bitbucket proporcionada por Ellislab (en la respuesta @WesleyMurch) ya no está disponible, ya que Ellislab cerró el repositorio. – Lvkz

1

Si no desea utilizar una versión anterior de PHP en su instalación MAMP puede utilizar:

$_REQUEST

para obtener los datos en lugar de $_POST

$_REQUEST es una matriz asociativa que contiene por defecto el contenido del $_GET, $_POST y $_COOKIE.

More info: http://php.net/manual/en/reserved.variables.request.php

Y que devuelve todos los datos que por alguna razón $_POST está rompiendo!

Cuestiones relacionadas