Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: X технологии > не передает русский текст


Автор: z006 11.3.2010, 14:14
изначально написал в раздел по XML,но меня перенаправили сюда.

Код

<?
$doc = new DOMDocument('1.0','windows-1251');
header('Content-Transfer-Encoding: 8bit');
header('Content-Type: text/xml; charset=UTF-8');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); 
header('Cache-Control: no-store, no-cache, must-revalidate'); 
header('Cache-Control: post-check=0, pre-check=0', FALSE); 
header('Pragma: no-cache'); 
$level = $doc->createElement("response");
$doc -> appendChild($level);
db_connect();
.................
  $qq=db_query("SELECT name FROM n WHERE id=$e[k]");
  $ee=mysql_fetch_array($qq);
.................
    $root = $doc->createElement("block");
     $level->appendChild($root);
     $item = $doc->createElement("answer");
     $root->appendChild($item);
   $textid = $doc->createTextNode($out);
   $item->appendChild($textid);
echo $doc->saveXML();
?>



данные уходят к яваскрипт файлу.беда такова,что если в поле name у нас текст на латинице-никаких проблем,все передается.а если на кирилице-ни в какую.как-то не хочется до передачи загонять в ютф_енкод,а в яваскрипте разбирать аналогом ютф_декод.
может есть более грамотное решение?

Автор: bars80080 11.3.2010, 14:26
Цитата(z006 @  11.3.2010,  13:14 Найти цитируемый пост)
а если на кирилице-ни в какую

а что вы собственно хотели? у вас разброд в кодировках:
Цитата(z006 @  11.3.2010,  13:14 Найти цитируемый пост)
$doc = new DOMDocument('1.0','windows-1251');
header('Content-Transfer-Encoding: 8bit');
header('Content-Type: text/xml; charset=UTF-8');

надо выбирать что-то одно

Автор: z006 11.3.2010, 14:29
Код

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

при смене кодировки на cp1251 или windows-1251 результат не меняется. 

Автор: bars80080 11.3.2010, 14:36
Цитата(z006 @  11.3.2010,  13:29 Найти цитируемый пост)
при смене кодировки на cp1251 или windows-1251 результат не меняется.  

я догадывюсь, что у вас весь остальной скрипт заточен под utf-8. к примеру, при подключении к БД стоит set names utf8, или ещё что.

сведите пример к простому варианту, выкинув вначале всё, а затем добавляя отдельные конструкции, постепенно усложняя. увидите на каком этапе появляется ошибка

Автор: z006 11.3.2010, 15:28
Код

<?
$doc = new DOMDocument('1.0','windows-1251');
header('Content-Transfer-Encoding: 8bit');
header('Content-Type: text/xml; charset=UTF-8');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); 
header('Cache-Control: no-store, no-cache, must-revalidate'); 
header('Cache-Control: post-check=0, pre-check=0', FALSE); 
header('Pragma: no-cache'); 
$level = $doc->createElement("response");
$doc -> appendChild($level);
require "../../confa/db.php";
$db=mysql_connect(db_server, db_user, db_passwd);
          $tmp = @mysql_query("SHOW VARIABLES like 'character_set_server';"); 
          $enc = @mysql_fetch_assoc($tmp); 
          @mysql_free_result($tmp); 
          $enc = $enc['Value']; 
          @mysql_query("SET character_set_client='$enc'"); 
          @mysql_query("SET character_set_connection='$enc'"); 
          @mysql_query("SET character_set_database='$enc'"); 
          @mysql_query("SET character_set_results='$enc'"); 
          unset($enc); 
          unset($tmp);
mysql_select_db(db_basename,$db);
$q=mysql_query("SELECT 1,2,3,4 FROM t WHERE s LIKE ................................");
$out="[";
for ($w=0; $w<mysql_num_rows($q);$w++)
 {
..............
 }
    $root = $doc->createElement("block");
     $level->appendChild($root);
     $item = $doc->createElement("answer");
     $root->appendChild($item);
   $textid = $doc->createTextNode($out);
   $item->appendChild($textid);
echo $doc->saveXML();
?>

если оставляю так-результат как я и написал в начале темы.





Код

<?
$doc = new DOMDocument('1.0','windows-1251');
header('Content-Transfer-Encoding: 8bit');
header('Content-Type: text/xml; charset=UTF-8');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); 
header('Cache-Control: no-store, no-cache, must-revalidate'); 
header('Cache-Control: post-check=0, pre-check=0', FALSE); 
header('Pragma: no-cache'); 
$level = $doc->createElement("response");
$doc -> appendChild($level);
require "../../confa/db.php";
$db=mysql_connect(db_server, db_user, db_passwd);
mysql_select_db(db_basename,$db);
$q=mysql_query("SELECT 1,2,3,4 FROM t WHERE s LIKE ................................");
$out="[";
for ($w=0; $w<mysql_num_rows($q);$w++)
 {
..............
 }
    $root = $doc->createElement("block");
     $level->appendChild($root);
     $item = $doc->createElement("answer");
     $root->appendChild($item);
   $textid = $doc->createTextNode($out);
   $item->appendChild($textid);
echo $doc->saveXML();
?>

если так-то пишет mysql_num_rows(): supplied argument is not a valid MySQL result resource

так что что-то никак оно русский язык не хочет передавать.....

Автор: z006 11.3.2010, 18:34
временно решил проблему перекодировкой каждой выводимой переменной через iconv("CP1251", "UTF-8", $e['sname']); ,хотя седалищным нервом чувствую что не грамотно это.за сим по-прежнему прошу умного совета как выкрутится?

Автор: solenko 11.3.2010, 19:02
Цитата(z006 @  11.3.2010,  13:14 Найти цитируемый пост)
данные уходят к яваскрипт файлу.

http://www.w3.org/TR/2006/WD-XMLHttpRequest-20060405/
Цитата

 the data must be encoded as UTF-8 for transmission.

И это работает в двух направлениях. Для других кодировок, скорее всего, будет доступен responseText
Цитата(z006 @  11.3.2010,  17:34 Найти цитируемый пост)
,хотя седалищным нервом чувствую что не грамотно 

Ну... Грамотней изначально работать с юникодом )

Автор: z006 11.3.2010, 19:09
Цитата(solenko @ 11.3.2010,  19:02)
Ну... Грамотней изначально работать с юникодом )

да,но в базе-то все в cp1251......

Автор: solenko 11.3.2010, 19:10
Изначально подразумевает ДО старта проекта и наполнения базы )

Автор: z006 11.3.2010, 19:17
хех,ну а сейчас что делать?или перекодирование как я сделал-самый оптимальный вариант?

Автор: bars80080 11.3.2010, 20:02
если заморочек с переписыванием скриптов немного (при грамотной конструкции их вообще быть недолжно), то отконвертировать всю базу в ютф-8 - пара минут

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)