[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проблема кодировки Ajax
SirusVirus
Привет всем! Несколько недель назад пытался начать изучать AJAX, и вот в инете нашел такой вот пример простенький: вводишь имя скрипт проверяет на совпадение (сравнивает с именами из массива), и дает знать, если имя уже есть (если нет, тоже дает знать biggrin.gif )! Теперь, проблема в том, что когда ввожу имя на английском, то все ОК, а когда на русском, то скрипт не работает: постоянно показывает, что совпадений нет... Все файлы сохранял в utf-8 кодировке, также кодировка страницы utf-8. Я так думаю, что дело в кодировке. Помогите плиз, у кого какие идеи?

index.html
HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html dir="ltr" lang="ru" xmlns="http://www.w3.org/1999/xhtml" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>AJAX Test</title>

<script src="clienthint.js"></script>
</head>
<body>

<form>
First Name: <input type="text" id="txt1" onkeyup="showHint(this.value)" />
</form>
<p>Suggestions: <span id="txtHint"></span></p>

</body>
</html>


clienthint.js
Код
var xmlhttp

function showHint(str)
{
if (str.length==0)
 {
 document.getElementById("txtHint").innerHTML="";
 return;
 }
xmlhttp=GetXmlHttpObject();
if (xmlhttp==null)
 {
 alert ("Your browser does not support XMLHTTP!");
 return;
 }
var url="gethint.php";
url=url+"?q="+str;
url=url+"&sid="+Math.random();
xmlhttp.onreadystatechange=stateChanged;
xmlhttp.open("GET",url,true);
xmlhttp.send(null);
}

function stateChanged()
{
if (xmlhttp.readyState==4)
 {
 document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
 }
}

function GetXmlHttpObject()
{
if (window.XMLHttpRequest)
 {
 // code for IE7+, Firefox, Chrome, Opera, Safari
 return new XMLHttpRequest();
 }
if (window.ActiveXObject)
 {
 // code for IE6, IE5
 return new ActiveXObject("Microsoft.XMLHTTP");
 }
return null;
}


gethint.php
PHP
<?php
// Fill up array with names
$a[]="Анна";
$a[]="Brittany";
$a[]="Cinderella";
$a[]="Diana";
$a[]="Eva";
$a[]="Fiona";
$a[]="Gunda";
$a[]="Hege";
$a[]="Inga";
$a[]="Johanna";
$a[]="Kitty";
$a[]="Linda";
$a[]="Nina";
$a[]="Ophelia";
$a[]="Petunia";
$a[]="Анабелла";
$a[]="Raquel";
$a[]="Cindy";
$a[]="Doris";
$a[]="Eve";
$a[]="Evita";
$a[]="Sunniva";
$a[]="Tove";
$a[]="Unni";
$a[]="Violet";
$a[]="Liza";
$a[]="Elizabeth";
$a[]="Ellen";
$a[]="Wenche";
$a[]="Vicky";

//get the q parameter from URL
$q=$_GET["q"];

//lookup all hints from array if length of q>0
if (strlen($q) > 0)
  {
  
$hint="";
  for(
$i=0$i<count($a); $i++)
    {
    if (
strtolower($q)==strtolower(substr($a[$i],0,strlen($q))))
      {
      if (
$hint=="")
        {
        
$hint=$a[$i];
        }
      else
        {
        
$hint=$hint." , ".$a[$i];
        }
      }
    }
  }

// Set output to "no suggestion" if no hint were found
// or to the correct values
if ($hint == "")
  {
  
$response="no suggestions";
  }
else
  {
  
$response=$hint;
  }

//output the response
echo $response;




Спустя 5 часов, 27 минут, 12 секунд (20.09.2009 - 05:04) kirik написал(а):
SirusVirus
Из-за того что в utf8 и не работает. Для работы со строками в юникоде предусмотрены специальные мультибайтовые функции, тоесть обычные str* не прокатят (а у тебя там strtolower проверяет и strlen).

Спустя 10 часов, 36 минут, 9 секунд (20.09.2009 - 15:40) SirusVirus написал(а):
Цитата (kirik @ 20.09.2009 - 02:04)
Из-за того что в utf8 и не работает. Для работы со строками в юникоде предусмотрены специальные мультибайтовые функции, тоесть обычные str* не прокатят (а у тебя там strtolower проверяет и strlen).

Как я понял, нужно все строковые функции типа strlen заменить на mb_strlen??? Так и сделал, но результата нет sad.gif
P.S. Кстати при установке PHP я добавлял расширение MBString!

Спустя 1 день, 13 часов, 19 минут, 37 секунд (22.09.2009 - 05:00) kirik написал(а):
Проверь, что приходит в $_GET["q"]..

Спустя 2 часа, 48 минут, 23 секунды (22.09.2009 - 07:48) Michael написал(а):
Вместо:
url=url+"?q="+str;
надо:
url=url+"?q="+encodeURIComponent(str);

Спустя 3 часа, 32 минуты, 8 секунд (22.09.2009 - 11:20) twin написал(а):
Цитата
Как я понял, нужно все строковые функции типа strlen заменить на mb_strlen??? Так и сделал, но результата нет

Нужно еще указать кодировку. mb_ не значит utf, это значит многобайтная. Он не понимает, что ты хочешь от него:
PHP
strtolower($q, 'utf-8')

Можно один раз, в начале скрипта указать
PHP
mb_internal_encoding('utf-8');

Спустя 4 дня, 2 часа, 48 минут, 48 секунд (26.09.2009 - 14:09) SirusVirus написал(а):
Цитата (Michael @ 22.09.2009 - 04:48)
Вместо:
url=url+"?q="+str;
надо:
url=url+"?q="+encodeURIComponent(str);

Спасибо большое smile.gif Теперь все работает!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.