Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Перевод HTML entities (например, &#9994) в текст windows-1251. (Николай Булыгин)
Author Message
Николай Булыгин
Участник форума



Joined: 20 Nov 2004
Posts: 76
Карма: 0
   поощрить/наказать

Location: Samara

PostPosted: Mon Feb 14, 2005 9:14 am (написано за 5 минут 20 секунд)
   Post subject: Перевод символов типа ✊ в нормальный вид
Reply with quote

После парсинга XLS файла, если в файле встречаются русские символы, то они переводятся в спец. символы HTML, вот такой функцией:
Code (php): скопировать код в буфер обмена
function uc2html($str) {
        $ret = '';
        for( $i=0; $i<strlen($str)/2; $i++ ) {
                $charcode = ord (www.php.net/ord)($str[$i*2])+256*ord (www.php.net/ord)($str[$i*2+1]);
                $ret .= '&#'.$charcode;
        }
        return $ret;
}
Пробовал модифицировать данную функцию с помощью chr($charcode), но вылазиют кракозябли, такие же символы получаются при открытии файла по F3 в Norton(Total) Commander. Все было бы хорошо, если бы эти данные из файла не шли в базу, а сразу в HTML.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Mon Feb 14, 2005 1:34 pm (спустя 4 часа 19 минут; написано за 38 секунд)
   Post subject:
Reply with quote

Кодировка какая? Если UTF-8, то переводить нужно совсем другой функцией:
Code (php): скопировать код в буфер обмена
function utf2entity($s) {
    $tgt = '';
    for($i=0,$len=strlen (www.php.net/strlen)($s); $i<$len; $i++) {
        $c = $s[$i];
        $x = ord (www.php.net/ord)($c);
        if ($x < 0x80) { // 1-байтовый символ
            $tgt .= $c;
            continue;
        } elseif (($x & 0xC0) == 0xC0) { // (n+1)-байтовый символ
            $n = 1;
            while ( ($x & (0x40 >> $n)) > 0) $n++;
            $code = $x & (0x3F >> $n);
            for ($k=1; $k<=$n; $k++) {
                $y = ord (www.php.net/ord)($s[$i+$k]) & 0x3F;
                $code = ($code << 6) + $y;
            }
            $i += $n;
            // В переменной $code содержится Unicode-код текущего символа.
            // Здесь можно преобразовать его в нужную нам 8-битную кодировку или просто сделать из него HTML-entity.
            $tgt .= '&#x'.dechex($code).';';
        } else {
            $tgt .= '?'; // такого не должно быть
        }
    }
    return $tgt;
}
Back to top
View user's profile Send private message Send e-mail
Николай Булыгин
Участник форума



Joined: 20 Nov 2004
Posts: 76
Карма: 0
   поощрить/наказать

Location: Samara

PostPosted: Mon Feb 14, 2005 2:17 pm (спустя 43 минуты; написано за 4 минуты 41 секунду)
   Post subject:
Reply with quote

Дмитрий, как узнать какая кодировка у XLS файла? Я сделал по другому - не очень правильно я думаю:
Code (php): скопировать код в буфер обмена
function trash2rus($trashstr) {
       $ru = array (www.php.net/array)('', '',
                   '', '',
                   '', '',
                   '', '');
       $trash = array (www.php.net/array)('&#1049', '&#1081',
                   '&#1062', '&#1094',
                   '&#1059', '&#1091',
                   '&#1050', '&#1082');
       return str_replace (www.php.net/str_replace)($trash, $ru, $trashstr);
}
Сейчас попробую ваш вариант.
Back to top
View user's profile Send private message
Николай Булыгин
Участник форума



Joined: 20 Nov 2004
Posts: 76
Карма: 0
   поощрить/наказать

Location: Samara

PostPosted: Mon Feb 14, 2005 2:25 pm (спустя 7 минут; написано за 1 минуту 4 секунды)
   Post subject:
Reply with quote

O<AOG< - такие символы выводит эта функция. ;-(
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Mon Feb 14, 2005 2:54 pm (спустя 28 минут; написано за 1 минуту)
   Post subject:
Reply with quote

Николай Булыгин wrote:
Дмитрий, как узнать какая кодировка у XLS файла?
Что значит - "как узнать"? Там должно быть написано.
Кодировка самого XSLT-файла - в <?xml ... encoding="..."?>, если не ошибаюсь.
А кодировка результирующего документа, который получается после преобразований, в тэге <xslt:output> задается.
Back to top
View user's profile Send private message Send e-mail
Николай Булыгин
Участник форума



Joined: 20 Nov 2004
Posts: 76
Карма: 0
   поощрить/наказать

Location: Samara

PostPosted: Mon Feb 14, 2005 3:08 pm (спустя 14 минут; написано за 6 минут 43 секунды)
   Post subject:
Reply with quote

Дмитрий, Вы наверное неправильно меня поняли. Я говорю про файлы Microsoft Excel, не понимаю при чем тут XML? Причем это файлы не CSV, а именно XLS - файлы - т.е. как бы сказать - бинарные - что-ли. Внутри файла:
Code (any language): скопировать код в буфер обмена
- такой ужас. При парсинге такого файла получаю что русские символы преобразуются в коды типа - &#3849 - но мне так не нужно. Хочу чтобы русские слова как были набраны в Excel-е, такими и выводились в HTML.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Mon Feb 14, 2005 3:13 pm (спустя 4 минуты; написано за 1 минуту 38 секунд)
   Post subject:
Reply with quote

Ой. Это я XLS прочитал как XSLT, виноват. ;-)
Николай Булыгин wrote:
При парсинге такого файла получаю что русские символы преобразуются в коды типа - &#3849
А чем парсите?

Вообще, уточните задачу. По крайней мере, опишите подробно, что имеется на входе, и что должно быть на выходе.
Back to top
View user's profile Send private message Send e-mail
Николай Булыгин
Участник форума



Joined: 20 Nov 2004
Posts: 76
Карма: 0
   поощрить/наказать

Location: Samara

PostPosted: Mon Feb 14, 2005 7:29 pm (спустя 4 часа 15 минут; написано за 18 секунд)
   Post subject:
Reply with quote

На входе имеется абсолютно любой файл в формате MS Excel, но не CSV - заказчик не хочет конвертировать. Данные из файла нужно заливать в базу, т.е. на выходе должны быть те же данные что и в файле. Парсингом занимается скрипт - который дал заказчик, это Zakkis.PHP.Excel.Parser.Pro.v4.0-SSG, www.zakkis.ca/products/abc_excelparser/index.php - но этот скрипт, выдает вместо простых букв - их коды, т.е. как вы назвали HTML entities, меня этот вариант не устраивает, т.к. некоторые строки мне еще нужно сравнивать, и вообще в базе к примеру сортировать, что неприемлимо - когда текст идет в виде &#23&#56&#32. Я справился с проблемой - писал уже выше - банальной заменой кода на его эквивалент. Функция получилась огромная, и думаю, что еще не все символы в ней учтены, хотя вбил туда все знаки которые только нашел на клавиатуре - думаю что это не правильно, и есть другой - более простой способ. Только какой? Подскажите где почитать про парсинг XLS файлов - только не CSV. К посту в качестве приложения даю скрипт парсинга, там в папке samlpes - есть пример xls2html - вот этот скрипт я и использую.


ssgzep40.zip
 Description:
Zakkis.PHP.Excel.Parser.Pro.v4.0-SSG

Download
 Filename:  ssgzep40.zip
 Filesize:  36.26 KB
 Downloaded:  496 Time(s)

Back to top
View user's profile Send private message
Николай Булыгин
Участник форума



Joined: 20 Nov 2004
Posts: 76
Карма: 0
   поощрить/наказать

Location: Samara

PostPosted: Mon Feb 14, 2005 7:36 pm (спустя 6 минут; написано за 4 минуты 50 секунд)
   Post subject:
Reply with quote

Прошу модераторов переименовать топик, т.к. он не соответствует названию, прошу вернуть старое название. Старое название: Перевод символов типа &#9994 в его эквивалент. Или же можно: Правильный парсинг ХЛС файлов.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Mon Feb 14, 2005 7:41 pm (спустя 4 минуты)
   Post subject:
Reply with quote

Ну при чем тут XLS вообще, скажите на милость? В действительности, насколько я понял, задача ставится так. "Есть текст с вставленными HTML Entities вида &#XXXX;. Необходимо все entities преобразовать в символы кодировки windows-1251." Все верно?

Решение примерно такое:
Code (php): скопировать код в буфер обмена
function entities2windows($text)
{
  return preg_replace_callback (www.php.net/preg_replace_callback)('/&#(\d+);/s', 'entities2windows_callback', $text)
}
function entities2windows_callback($p)
{
  $c = $p[1];
  if ($c < 256) return chr (www.php.net/chr)($c);
  $u = pack (www.php.net/pack)('n', $c);
  return @iconv (www.php.net/iconv)('UCS-2BE', "windows-1251", $u);
}
При этом должно быть установлено расширение iconv, конечно (у большинства хостеров оно стоит).
Back to top
View user's profile Send private message Send e-mail
Николай Булыгин
Участник форума



Joined: 20 Nov 2004
Posts: 76
Карма: 0
   поощрить/наказать

Location: Samara

PostPosted: Mon Feb 14, 2005 8:30 pm (спустя 49 минут; написано за 2 минуты 42 секунды)
   Post subject:
Reply with quote

Попытался запустить на своем личном компьютере, видать, у меня не установлено это расширение iconv, а смарти почему-то не выводит ошибку, ничего не отдает в браузер, хотя error_reporting(E-ALL). Где почитать про это расширение?
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Mon Feb 14, 2005 8:35 pm (спустя 5 минут; написано за 29 секунд)
   Post subject:
Reply with quote

php.net/iconv
Если пользуетесь Денвером, скачайте пакет с библиотеками PHP. Если вручную ставили PHP - подключите расширение.
Back to top
View user's profile Send private message Send e-mail
Николай Булыгин
Участник форума



Joined: 20 Nov 2004
Posts: 76
Карма: 0
   поощрить/наказать

Location: Samara

PostPosted: Tue Feb 15, 2005 4:33 pm (спустя 19 часов 58 минут; написано за 22 минуты 39 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров, спасибо за ценную информацию! Только в исходнике вы забыли ; поставить в функции entities2windows. Я ставил сам PHP пришлось кроме того, чтобы раскомментировать строчку в ini, скачать дополнительно библиотечку iconv.dll, только после этого заработало. Еще раз спасибо.
Back to top
View user's profile Send private message
Dzeen
Guest





Карма: 388
   поощрить/наказать


PostPosted: Fri Apr 17, 2009 4:34 pm (спустя 4 года 2 месяца 2 дня 39 секунд; написано за 53 секунды)
   Post subject:
Reply with quote

Непонимаю, в чем дело.даже используя данную функцию, все равно не кодирует, и выводятся вышенаписанные кракозяблы....
Back to top
Sawa
Guest





Карма: 388
   поощрить/наказать


PostPosted: Fri Jul 24, 2009 5:24 pm (спустя 3 месяца 7 дней 50 минут; написано за 1 минуту 32 секунды)
   Post subject:
Reply with quote

Для правильной перекодировки в win-1251 нужно заменить строку
$s = uc2html($exc->sst['data'][$ind]);
на
$s = iconv("UTF-16LE", "Windows-1251", $exc->sst['data'][$ind]);
И конечно должен быть iconv установлен
Back to top
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML