Автодополнение Ajax потеряно при кодировании символов - PullRequest
0 голосов
/ 27 декабря 2011

Схема представляет собой текстовое поле ввода в html-форме, которое заполняется автоматически с помощью jQuery.autocomplete и получения соответствующего ответа сервера (например, список json с названием города).Весь пакет работает хорошо ... за исключением того, что клиент не получает данные, возвращаемые с сервера, при наборе ударных символов (шт ..).Как и многие, похоже, что я сталкиваюсь с проблемой кодировки символов, но не могу понять, где и как ее решить, несмотря на множество попыток ( iconv , utf8_encode , urldecode ...) и чтения типа этот например.

Поэтому мне понадобится некоторая помощь / подсказки, чтобы понять, где действовать (перед созданием прототипа кода автозаполнения jQuery ...?)

РЕДАКТИРОВАТЬ: может также быть проблема сворачивания акцента jQuery, япопробую также таким образом .


  • Конфигурация:
    сервер: Apache2.2 (debian lenny)
    php: скомпилирован 5.3.3(поэтому опция JSON_UNESCAPED_UNICODE недоступна для json_encode )
    mysql: 5.1.49 с набором символов MySQL: UTF-8 Unicode (utf8),
    класс: с использованием модифицированного PFBC2.x версия для создания формы php

  • meta
    Сайт в основном предназначен для французских пользователей, поэтому он все разработан с ISO-8859-1 (я думаю, плохой первоначальный выбор):

    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    
  • jQuery код автозаполнения (применяется к полю ввода города)

    // DEBUG Testing (tested w/ and w/o the $charset_attr: no change)
    $charset_attr = 'contentType: "application/x-www-form-urlencoded;charset=ISO-8859-1"';
    echo 'jQuery("#' . $this->attributes["id"] . '").autocomplete({source:"' , $this->xhr_path . '", minLength:2, ' . $charset_attr .'});';
    

    Сгенерированный код для этого поля ввода соответствует приведенному выше исключению.

  • Преобразование строк mysql в utf8 с использованием этой функции :
    Я преобразую возвращаемый массив msyql в utf8 перед отправкой json обратно клиенту.На самом деле я тестировал и писал также другие функции, но это ничего не меняет, так что, думаю, дело не в этом.

    $encoded_arr = utf8json($returnData);   
    echo json_encode($encoded_arr);   
    flush();   
    
  • Элемент управления кодированием 1 (на стороне клиента)
    Элемент управления встраивания в html-форме для проверки того, какая кодировка символов фактически передается в jQuery.autocomplete :

    jQuery(document).ready(function() {   
    <?php   
    $test_str ="foobar";
    $check_encoding = "'" . mb_detect_encoding($test_str) . "'";
    ?>
    alert('Check charset server encoding: ' + <?php echo $check_encoding;?> ); // output : ASCII
    });
    
  • Элемент управления кодированием 2 (на стороне сервера)

    $inputData = (isset($_GET))? htmlspecialchars($_GET['term'],ENT_COMPAT, 'UTF-8') : NULL;   
    $encoding_get = mb_detect_encoding($_GET['term']);   
    $encoding_data = mb_detect_encoding($inputData);   
    $utf8converted = @iconv(strtolower($encoding_get), 'utf-8', $inputData);   
    $checkconversion = mb_detect_encoding($utf8converted);   
    

    Отправка обычных строчных букв (ea ..), я получаю все как ASCII .
    Отправляя символы нижнего регистра с ударением (шт ..), я получаю все как UTF8 .

Так что я потерян каксервер получает правильную строку символов, выдает возврат json (проверено без ajax), но похоже, что клиент не получает или не интерпретирует это должным образом.

1 Ответ

0 голосов
/ 30 декабря 2011

Для тех, кто сталкивается с такой же ...% $ @ проблемой, вот что я сделал, чтобы решить мое дело:

  • Проверка кодировки символов на каждом узле (например, клиент, сервер Apache, сервер MySQL), используя mb_detect_encoding на стороне сервера,

  • Наконец указали на проблемный узел определения местоположения: в моем случае передача символов UTF8 на сервер mysql i / o по латинице ISO-8859-1, поэтому сервер mysql не возвратил ожидаемые ответы, которые я не смог обнаружить или отладка с прямым размещением URL-адреса данных на сервере сценария. Поэтому я должен был записывать ввод и вывод в файл, проверяя кодировку символов ввода и вывод сервера mysql.

  • Изменен запрос ajax на POST i / o GET,

  • Решается путем кодирования данных $ _POST в ISO перед отправкой запроса к серверу mysql с использованием mb_convert_encoding , а также описанным здесь .

...