webew
Войти » Регистрация
 
PHP

Как декодировать

11 августа 2012, 21:10
Автор: Igor12
Сайт и БД в кодировке UTF-8. Вся информация из БД выводится на сайт нормально. Но вот из одной таблицы выводится информация в не читаемом виде (0440\u0435\u0432\u043d\..). Не знаю, какую команду прописать в PHP, чтобы при выводе из БД декодировалась эта информация на сайте в русский текст в формате UTF-8.
Добавить комментарий
Отображение комментариев: Древовидное | Плоское
NO USERPIC

rgbeast

См. здесь http://stackoverflow.com/questions/8180920/how-to-decode-something-beginning-with-u-with-php
11.08.2012, 22:06
Ответить
NO USERPIC

Igor12

Я забыл написать, что я не программист. Посмотрел по вашей ссылке, но не понял что и куда вставить
11.08.2012, 22:12
Ответить
NO USERPIC

Igor12

Мне подсказали вписать строку: $addr = iconv("UTF-8", "Windows-1251", $row[profile_value]);
Но у меня и БД и сайт в UTF-8, поэтому не помогло.
11.08.2012, 22:15
Ответить
NO USERPIC

rgbeast

Попробуйте так:
$addr = transliterator_transliterate("Hex-Any/Java", $row[profile_value]);
11.08.2012, 22:18
Ответить
NO USERPIC

Igor12

Вместе с вашей строкой код выглядит так:
$db = JFactory::getDBO();
$query = "SELECT * FROM #__user_profiles WHERE user_id = {test___id_user} and profile_key='profile.address1'";
$db->setQuery($query);
$row = $db->loadAssoc();
$addr = transliterator_transliterate("Hex-Any/Java", $row[profile_value]);
return ($addr);

Но не сработало, чистый лист выдает.
11.08.2012, 22:28
Ответить
NO USERPIC

rgbeast

Включите error reporting, чтобы видеть в чем ошибка. Скорее всего нет функции transliterator_transliterate, так как она требует новой версии PHP: (PHP >= 5.4.0, PECL intl >= 2.0.0)
11.08.2012, 23:12
Ответить
NO USERPIC

Igor12

Включил.
Вот что пишет: Caught exception on eval of adr:
adr - это поле (колонка в таблице) в которую я пытаюсь вывести адрес в читаемом виде из базы
11.08.2012, 23:24
Ответить
NO USERPIC

Igor12

Версия PHP 5.2.11
11.08.2012, 23:29
Ответить

1234ru

Без конкретных данных непонятно.
Сделайте резервную копию таблицы, заархивируйте и выложите здесь в виде файла (при добавлении комментария ссылка "Загрузить файл" над формой).

Резервная копия таблицы делается с помощью команды mysqldump:

mysqldump -u пользователь -pпароль (без пробела после p!) -h хост (обычно localhost) название_бд имя_таблицы > файл.sql
То, что не убивает нас, делает нас инвалидами.
12.08.2012, 19:44
Ответить
NO USERPIC

Igor12

Не понял как опубликовать файл. Вот ссылка http://webew.ru/f/yJ1F6nlU.zip
12.08.2012, 20:56
Ответить

1234ru

Цитата:
из одной таблицы выводится информация в не читаемом виде (0440\u0435\u0432\u043d\..)

Так происходит, потому что в таблице испорчена информация. У вас в ней прямо так и написано:
"\u0433. \u041f\u0435\u0440\u043c\u044c, \u0443\u043b. \u0421\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u0435\u0439, 1-58".

Для преобразования можно использовать следующий код:

<?php

function convert($text) {   
    $text = preg_replace_callback(  
            '/\\\\u([\da-f]{4})/',
            'utfcode2char',
            $text
        );
    return $text;
}

function utfcode2char($matches) {   
    $code = '&#x' . $matches[1] . ';'
    return html_entity_decode(
            $code,
            FALSE,
            'UTF-8'
        );
}

header("Content-type: text/html; charset=utf-8"); // это для браузера

// пример из вашей таблицы
$example = '"\u0433. \u041f\u0435\u0440\u043c\u044c, \u0443\u043b. \u0421\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u0435\u0439, 1-58"';

echo convert($example);

?>
То, что не убивает нас, делает нас инвалидами.
14.08.2012, 13:09
Ответить
NO USERPIC

Igor12

У меня вот такой код:

$db = JFactory::getDBO();
$query = "SELECT * FROM #__user_profiles WHERE user_id = {zheu_fk_street___user} and profile_key='profile.address1'";
$db->setQuery($query);
$row = $db->loadAssoc();
$addr = iconv("UTF-8", "Windows-1251", $row[profile_value]);
return ($addr);

"Windows-1251"-наверно не правильно. У меня сайт и БД в utf-8

Может подскажете правильный код?
15.08.2012, 12:26
Ответить

1234ru

Поправка: не нужно было использовать intval() при преобразовании кодов в символы.
С учетом этой поправки я исправил приведенный выше код.

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

Скрипт можно запускать из командной строки (php имя-скрипта.php) или положить на сайт и запустить через браузер.

Перед запуском сделайте резервную копию.

<?php

# предварительно установить соединение
# с сервером MySQL в кодировке UTF-8

# также нужно подключить файл
# с функцией convert() или вставить её прямо сюда

require_once 'mysql-functions.php';

$sql = "
    SELECT
        user_id,
        profile_key,
        profile_value
    FROM jos_user_profiles
    "
;
   
// Для каждой записи получаем и записывем
// исправленное значение
foreach (mysql_gettable($sql) as $row) {
   
    $fixed = convert($row['profile_value']);
    // код функции convert см. ниже
   
    // Тут же делаем запрос,
    // записываем в БД исправленные данные
    $sql = "
        UPDATE jos_user_profiles
        SET profile_value = '"
. mysql_real_escape_string($fixed) . "'
        WHERE user_id = $row[user_id]
          AND profile_key = '$row[profile_key]'
        "
;
    mysql_q($sql)
}

?>
То, что не убивает нас, делает нас инвалидами.
15.08.2012, 14:25
Ответить
NO USERPIC

Igor12

Наверное, надо было таблицу, куда я пытаюсь вывести информацию (адреса из профиля пользователя)? Тогда вот этот файл: http://webew.ru/f/nrB5h6J0.zip
12.08.2012, 21:59
Ответить

paulus

В питоне работает, вроде:
print u"\u0433. \u041f\u0435\u0440\u043c\u044c, \u0443\u043b. \u0421\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u0435\u0439, 1-58"
г. Пермь, ул. Строителей, 1-58
14.08.2012, 19:23
Ответить
NO USERPIC

Igor12

А мне что прописать, чтобы тоже выводил читаемый текст?
14.08.2012, 20:16
Ответить

paulus

Собственно, вот такой код декодирует файлик с названием «а»:

#! /usr/bin/python

f = open('a')
data = f.readlines()
for d in data:
    print(d.decode('unicode_escape'))
14.08.2012, 20:36
Ответить

paulus

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

1. Делаем резервную копию проблемной таблицы:
mysqldump dbname tablename >a
2. В результате получается файлик a с данными в указанном формате (лучше проверить)
3. Преобразуем файлик в utf-8
python convert.py >b
4. В результате получается файлик b с данными в utf-8 (проверить)
5. Заливаем назад
mysql dbname <b
14.08.2012, 20:40
Ответить
NO USERPIC

Igor12

Подсказали, что ошибка скорее всего в коде:

$db = JFactory::getDBO();
$query = "SELECT * FROM #__user_profiles WHERE user_id = {zheu_fk_street___user} and profile_key='profile.address1'";
$db->setQuery($query);
$row = $db->loadAssoc();
$addr = iconv("UTF-8", "Windows-1251", $row[profile_value]);
return ($addr);

Ну вот "Windows-1251" явно не сюда (сайт и БД в UTF-8. Но что и где поменять не знаю.
15.08.2012, 12:22
Ответить

paulus

Ну то есть надо заменить строку с iconv на $addr = $row[profile_value]?
15.08.2012, 13:08
Ответить
NO USERPIC

Igor12

Вот так?

$db = JFactory::getDBO();
$query = "SELECT * FROM #__user_profiles WHERE user_id = {zheu_fk_street___user} and profile_key='profile.address1'";
$db->setQuery($query);
$row = $db->loadAssoc();
$addr = $row[profile_value]?
return ($addr);

С таким кодом адрес не выводится.
15.08.2012, 13:16
Ответить

paulus

А с iconv выводится? <strike>так не бывает</strike>

Какие-то ошибки показывает?
15.08.2012, 14:18
Ответить
NO USERPIC

Igor12

Если код:
$db = JFactory::getDBO();
$query = "SELECT * FROM #__user_profiles WHERE user_id = {test___id_user} and profile_key='profile.address1'";
$db->setQuery($query);
$row = $db->loadAssoc();
$addr = iconv("UTF-8", "Windows-1251", $row[profile_value]);
return ($addr);

то выводится: "\u0414\u0435\u0440\u0435\u0432\u043d\u044f \u041a\u0443\u043a\u0443\u0435\u0432\u043e"

Если код с вашей вставкой:
$db = JFactory::getDBO();
$query = "SELECT * FROM #__user_profiles WHERE user_id = {zheu_fk_street___user} and profile_key='profile.address1'";
$db->setQuery($query);
$row = $db->loadAssoc();
$addr = $row[profile_value]?
return ($addr);

то ничего не выводится (чистое поле).

Могу скрины прислать. Может я вашу строку с ошибкой вставил? Проверьте, пожалуйста, в коде.
15.08.2012, 14:38
Ответить

paulus

$addr = $row[profile_value];

точка с запятой вместо вопросительного знака :)
15.08.2012, 14:59
Ответить
NO USERPIC

Igor12

Изменил, но результат тот же: чистое поле.
15.08.2012, 15:15
Ответить

1234ru

Посмотрите мой ответ.
Я проверял код, он вам исправит базу.
То, что не убивает нас, делает нас инвалидами.
15.08.2012, 15:31
Ответить
NO USERPIC

Igor12

Спасибо, вечером попробую. Но чувствую что решение проще. Ведь эта таблица выводится без ошибок на сайт в стандартном модуле Joomla.
15.08.2012, 15:38
Ответить

1234ru

Значит, в Joomla проводится преобразование (что-то типа функции convert).

Если вы хотите использовать эту базу где-то, кроме Joomla - нужно перекодировать.
Если устраивает так, как сейчас - оставьте как есть.
То, что не убивает нас, делает нас инвалидами.
15.08.2012, 16:59
Ответить
NO USERPIC

Igor12

Использовать базу буду только на Joomla. Но проблема в том что в одном стороннем компоненте (Fabrik) эти адреса выводятся некорректно. Хотя вся остальная информация в том же компоненте Fabrik выводится правильно. Поэтому я и думаю что вся проблема в коде, который прописан для вывода адреса в конкретном одном элементе компонента Fabrik.
Варианты кода я выложил здесь.
15.08.2012, 17:35
Ответить

1234ru

Тогда у вас вариантов два:
1. Поковыряться в Fabrik и найти место, где должно быть декодирование, но его нет.
2. Перекодировать базу и не трогать Fabrik (если база заполняется чем-то, что пишет туда данные в таком виде, этот вариант не подходит).
То, что не убивает нас, делает нас инвалидами.
15.08.2012, 23:15
Ответить
NO USERPIC

Igor12

Да, скорее всего так. Спасибо.
15.08.2012, 23:35
Ответить
Добавить комментарий
Отображение комментариев: Древовидное | Плоское
© 2008—2024 webew.ru, связаться: x собака webew.ru
Сайт использует Flede и соответствует стандартам WAI-WCAG 1.0 на уровне A.
Rambler's Top100

Реклама: