Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проблемка с кодировками
 
 автор: MRE   (23.06.2007 в 15:00)   письмо автору
 
 

В общем так. Написал чат на php/mysql/ajax
Работает так: текст, введенный в поле обрабатывается php-скриптом с помощью отправки запроса аяксом, там записывается в БД, затем этот же скрипт считыват из БД данные и возвращает их, а java-функция обрабатывает эти данные и динамически добавляет их на страницу.
Проблема с русским шрифтом - выводятся непонятные символы.
Кодировка - Windows-1251
Пробовал на UTF-8, не получилось
Как настроить и где чего прописать чтобы все нормально работало?
Нужно ли отдельно настраивать общую кодировку для php,js,mysql,html?
И если да, то каким образом?
Спасибо.

   
 
 автор: bronenos   (23.06.2007 в 17:05)   письмо автору
 
   для: MRE   (23.06.2007 в 15:00)
 

нужно на всех страницах указать кодировку, и если происходит отдача параметров через аякс то
obj.setRequestHeader ('Content-Type', 'multipart/x-www-form-urlencoded; charset=windows-1251');

   
 
 автор: MRE   (24.06.2007 в 12:56)   письмо автору
 
   для: bronenos   (23.06.2007 в 17:05)
 

на странице:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
в аяксе:
request.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=utf-8');
в Mysql:
mysql_query("SET NAMES UTF-8");
в начале php скрипта:
header("Charset: utf-8");

И все равно не работает.

   
 
 автор: bronenos   (24.06.2007 в 13:10)   письмо автору
 
   для: MRE   (24.06.2007 в 12:56)
 

header ('Content-Type: text/html; charset=utf-8');
или text/html или text/plain, смотря что на странице - хтмл или текст

   
 
 автор: MRE   (24.06.2007 в 13:36)   письмо автору
 
   для: bronenos   (24.06.2007 в 13:10)
 

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

Не хочет, а может в mysql когда записываешь данные надо еще как-то обозначать кодировку в которой пишешь?
Потому что если залезть в БД напрямую (myadmin например), там тоже иероглифы.

   
 
 автор: MRE   (24.06.2007 в 17:53)   письмо автору
 
   для: MRE   (24.06.2007 в 13:36)
 

Помогите, уже все перепробовал ничего не выходит, я приведу куски моего кода:

..............
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
..............


..............
                request.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=windows-1251');
                request.send(param);
...............

ява код получает все нормально, алертом выводил - русские буквы нормально отображаются, видимо проблема в php скрипте который обрабатывает запрос, вот собственно он:

<?php
    header
('Content-Type: text/xml; charset=windows-1251');
    
session_start(); 
    include(
"../inc/module/init.php");
    include(
"../inc/module/db_class.php");
    
$db1 = new db();
    if (
$_POST['mes'])
    {
        
$db1->query("SELECT * FROM users WHERE id='{$_SESSION['id']}'");
        
$row $db1->fetch();
        
$d date("Y-m-d H:i:s");
        
$mes htmlspecialchars($_POST['mes']);
        
$db1->query("insert into chat values ('{$row['login']}','$mes','$d','0')");
    }
......................

А это класс работы с БД:

<?php
    
class db
    
{
        var 
$link;
        var 
$result;

        function 
db()
        {
            
$this->link mysql_connect(DB_HOSTDB_USERDB_PASS) or die(mysql_error());
            
mysql_select_db(DB_NAME) or die(mysql_error());
            
mysql_query("SET NAMES 'cp1251'");
            
mysql_query("SET CHARACTER SET cp1251");
        }
......................

Инишка mysql:

[client]
port=3306
default-character-set=cp1251
[mysql]
default-character-set=cp1251
[mysqld]
port=3306
default-character-set=cp1251
character_set_server = cp1251
init-connect='SET NAMES cp1251'
basedir="C:/Programs/MySQL/MySQL Server 5.0/"
datadir="C:/Programs/MySQL/MySQL Server 5.0/Data/"
default-character-set=cp1251
................................


У кого какие соображения?

   
 
 автор: mr Bin   (24.06.2007 в 18:00)   письмо автору
 
   для: MRE   (24.06.2007 в 17:53)
 

> Потому что если залезть в БД напрямую (myadmin например), там тоже иероглифы

В данном случае, нужно отдавтаь данные с нормлаьной кодировкой. Не в ту степь смотрите.

   
 
 автор: MRE   (24.06.2007 в 18:07)   письмо автору
 
   для: mr Bin   (24.06.2007 в 18:00)
 

А можно поподробнее?
Что и как нужно сделать?

   
 
 автор: Osipov   (24.06.2007 в 18:56)   письмо автору
 
   для: MRE   (23.06.2007 в 15:00)
 

У меня когда были такие же проблемы с sajax'ом помогла следующая функция:


   function unicon($str, $to_uni = true) {
    $cp = Array (
        "А" => "&#x410;", "а" => "&#x430;",
        "Б" => "&#x411;", "б" => "&#x431;",
        "В" => "&#x412;", "в" => "&#x432;",
        "Г" => "&#x413;", "г" => "&#x433;",
        "Д" => "&#x414;", "д" => "&#x434;",
        "Е" => "&#x415;", "е" => "&#x435;",
        "Ё" => "&#x401;", "ё" => "&#x451;",
        "Ж" => "&#x416;", "ж" => "&#x436;",
        "З" => "&#x417;", "з" => "&#x437;",
        "И" => "&#x418;", "и" => "&#x438;",
        "Й" => "&#x419;", "й" => "&#x439;",
        "К" => "&#x41A;", "к" => "&#x43A;",
        "Л" => "&#x41B;", "л" => "&#x43B;",
        "М" => "&#x41C;", "м" => "&#x43C;",
        "Н" => "&#x41D;", "н" => "&#x43D;",
        "О" => "&#x41E;", "о" => "&#x43E;",
        "П" => "&#x41F;", "п" => "&#x43F;",
        "Р" => "&#x420;", "р" => "&#x440;",
        "С" => "&#x421;", "с" => "&#x441;",
        "Т" => "&#x422;", "т" => "&#x442;",
        "У" => "&#x423;", "у" => "&#x443;",
        "Ф" => "&#x424;", "ф" => "&#x444;",
        "Х" => "&#x425;", "х" => "&#x445;",
        "Ц" => "&#x426;", "ц" => "&#x446;",
        "Ч" => "&#x427;", "ч" => "&#x447;",
        "Ш" => "&#x428;", "ш" => "&#x448;",
        "Щ" => "&#x429;", "щ" => "&#x449;",
        "Ъ" => "&#x42A;", "ъ" => "&#x44A;",
        "Ы" => "&#x42B;", "ы" => "&#x44B;",
        "Ь" => "&#x42C;", "ь" => "&#x44C;",
        "Э" => "&#x42D;", "э" => "&#x44D;",
        "Ю" => "&#x42E;", "ю" => "&#x44E;",
        "Я" => "&#x42F;", "я" => "&#x44F;"
    );


    if ($to_uni) {
        $str = strtr($str, $cp);
    } else {
        foreach ($cp as $c) {
            $cpp[$c] = array_search($c, $cp);
        }
        $str = strtr($str, $cpp);
    }

    return $str;
  }
  $u2koi = array
  ( "%u0430" => "а", "%u0410" => "А",
    "%u0431" => "б", "%u0411" => "Б",
    "%u0432" => "в", "%u0412" => "В",
    "%u0433" => "г", "%u0413" => "Г",
    "%u0434" => "д", "%u0414" => "Д",
    "%u0435" => "е", "%u0415" => "Е",
    "%u0451" => "ё", "%u0401" => "Ё",
    "%u0436" => "ж", "%u0416" => "Ж",
    "%u0437" => "з", "%u0417" => "З",
    "%u0438" => "и", "%u0418" => "И",
    "%u0439" => "й", "%u0419" => "Й",
    "%u043A" => "к", "%u041A" => "К",
    "%u043B" => "л", "%u041B" => "Л",
    "%u043C" => "м", "%u041C" => "М",
    "%u043D" => "н", "%u041D" => "Н",
    "%u043E" => "о", "%u041E" => "О",
    "%u043F" => "п", "%u041F" => "П",
    "%u0440" => "р", "%u0420" => "Р",
    "%u0441" => "с", "%u0421" => "С",
    "%u0442" => "т", "%u0422" => "Т",
    "%u0443" => "у", "%u0423" => "У",
    "%u0444" => "ф", "%u0424" => "Ф",
    "%u0445" => "х", "%u0425" => "Х",
    "%u0446" => "ц", "%u0426" => "Ц",
    "%u0447" => "ч", "%u0427" => "Ч",
    "%u0448" => "ш", "%u0428" => "Ш",
    "%u0449" => "щ", "%u0429" => "Щ",
    "%u044A" => "ъ", "%u042A" => "Ъ",
    "%u044B" => "ы", "%u042B" => "Ы",
    "%u044C" => "ь", "%u042C" => "Ь",
    "%u044D" => "э", "%u042D" => "Э",
    "%u044E" => "ю", "%u042E" => "Ю",
    "%u044F" => "я", "%u042F" => "Я",

    "\r" => "",
    "\n" => "<br />",
    "\t" => ""
  );

  function utfencoderus(&$k,$v)
  {  global $u2koi;
     $k=unicon($k,false);
     $k=strtr($k,$u2koi);
  }


Здесь всё очень коряво, да и на названия функций --- koi... --- не обращайте внимания в какой водировке это сохраните, такая и будет, но всё же работает.

И когда в PHP вы получаете запрос с данными $args, то делаете:

array_walk_recursive($args,"utfencoderus")

И теперь args содержат нормальный русский текст (только помоему array_walk_recursive только с PHP5, если у вас старше, то надо как-то извращаться, но, я думаю, идея понятна)

И всё равно, на одном из хостингов у меня возникла проблема со знаком плюс, который превращался в пробел.

А при отправке данных обратно, Javaскрипту обработайте их с помощью unicon:
$esc_val = sajax_esc(unicon($value))

И перед отправкой данных из Javascript не забывайте применять к ним функцию escape

   
 
 автор: MRE   (25.06.2007 в 12:12)   письмо автору
 
   для: Osipov   (24.06.2007 в 18:56)
 

Разобрался, спасибо.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования