$ _POST пусто для символов utf-8 - PullRequest
8 голосов
/ 26 апреля 2011

Я работаю на многоязычном сайте с CodeIgniter.Существует форма, которая отправляет данные в контроллер, но $_POST пусто, когда я начинаю использовать турецкие символы, такие как öçüÜĞ и т. Д.

Я установил кодировку в:

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

Форма:

<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 и $this->input->post('editor_tr') возвращаются пустыми, но я могу увидеть необработанный пост с file_get_contents("php://input").

Этот работает нормально в обычном тесте PHP, ноне работает с CodeIgniter.Возможно, мой файл .htaccess вызывает проблему, но не знаю.

Любая помощь очень ценится.

ОБНОВЛЕНИЕ : Вот вывод для var_dump согласно запросу.

var_dump($_POST) - Без турецких символов

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

var_dump($_POST) - С турецкими символами (Ввод: Türkçe karakter, но он не отображается в $ _POST)

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

ОБНОВЛЕНИЕ 2: При отладке я обнаружил, что класс system.core.Input очищает входные данные с помощью функции _clean_input_data.

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

Итак, до того как $_POST достигнет моего контроллера, значение editor_tr уже очищено классом system.core.Utf8 в этой функции:

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

    return $str;
}

Ответы [ 4 ]

6 голосов
/ 27 апреля 2011

Поскольку комментарии накапливаются и, вероятно, будут пропущены, я собираюсь опубликовать еще несколько предложений.

Читатели, имейте в виду, что это относится к значениям данных $ _POST, а не к отображению данных на веб-странице.

У этого пользователя, похоже, похожая проблема:

Кажется, что Codeigniter ломает $ _POST символа '£' (фунт)

Здесь есть сообщение о Bitbucket, похожее на:

https://bitbucket.org/ellislab/codeigniter-reactor/issue/214/problem-when-inserting-special-characters: Удалена ссылка: EllisLabs закрыл этот репозиторий для публики

Может быть, добавление этого в ваш index.php поможет (вероятно, нет):

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

Перепроверьте и убедитесь, что вы не используете какие-либо правила проверки или подготовки на поле. Такие вещи, как url_title() будут лишать этих персонажей.

6 голосов
/ 26 июля 2012

Убедитесь, что тег формы имеет accept-charset:

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

Затем в контроллере используйте utf8_decode () при извлечении отправленных значений:

$value = utf8_decode($this->input->post('field_name'));
1 голос
/ 13 декабря 2012

Если вы не хотите использовать предыдущую версию PHP в вашей установке MAMP, вы можете использовать:

$_REQUEST

Чтобы получить данные вместо$_POST

$_REQUEST - это ассоциативный массив, который по умолчанию содержит содержимое $_GET, $_POST и $_COOKIE.

Дополнительная информация: http://php.net/manual/en/reserved.variables.request.php

И это возвращает все данные, которые по какой-то причине $_POST ломаются!

0 голосов
/ 26 апреля 2011

Это не ответ, но вы, возможно, захотите взглянуть и посмотреть, как все идет.


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

, а затем попробуйте с постом CI


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

print_r($post_data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...