Перевод из utf-8 в win-1251 - вылезают буквы "В"

Тема в разделе "PHP", создана пользователем pierrevk, 15 дек 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. pierrevk

    pierrevk Постоялец

    Регистр.:
    22 сен 2009
    Сообщения:
    59
    Симпатии:
    5
    Перепробовал кучу комбинаций - чертовщина какая-то!
    Перевожу код из utf-8 в win-1251, всё нормально, за исключением непечатаемых символов, типа " " (неразрывный пробел). Пробовал trim предварительно, пробовал вычищать это сочетание регуляркой - ничего не помогает. Если в оригинальном документе в source я вижу  , то в декодированном тексте оно предращается в "В "
    То есть текст нашпоговывается буквами "В"! Как вылечить?

    ПС: Для перевода текста из utf-8 в win-1251 использую такой код:

    PHP:
    function utf8_win1($s) {
    $s=strtr($s,array("\xD0\xB0"=>"а""\xD0\x90"=>"А""\xD0\xB1"=>"б""\xD0\x91"=>"Б",
     
    "\xD0\xB2"=>"в""\xD0\x92"=>"В""\xD0\xB3"=>"г""\xD0\x93"=>"Г""\xD0\xB4"=>"д",
     
    "\xD0\x94"=>"Д""\xD0\xB5"=>"е""\xD0\x95"=>"Е""\xD1\x91"=>"ё""\xD0\x81"=>"Ё",
     
    "\xD0\xB6"=>"ж""\xD0\x96"=>"Ж""\xD0\xB7"=>"з""\xD0\x97"=>"З""\xD0\xB8"=>"и",
     
    "\xD0\x98"=>"И""\xD0\xB9"=>"й""\xD0\x99"=>"Й""\xD0\xBA"=>"к""\xD0\x9A"=>"К",
     
    "\xD0\xBB"=>"л""\xD0\x9B"=>"Л""\xD0\xBC"=>"м""\xD0\x9C"=>"М""\xD0\xBD"=>"н",
     
    "\xD0\x9D"=>"Н""\xD0\xBE"=>"о""\xD0\x9E"=>"О""\xD0\xBF"=>"п""\xD0\x9F"=>"П",
     
    "\xD1\x80"=>"р""\xD0\xA0"=>"Р""\xD1\x81"=>"с""\xD0\xA1"=>"С""\xD1\x82"=>"т",
     
    "\xD0\xA2"=>"Т""\xD1\x83"=>"у""\xD0\xA3"=>"У""\xD1\x84"=>"ф""\xD0\xA4"=>"Ф",
     
    "\xD1\x85"=>"х""\xD0\xA5"=>"Х""\xD1\x86"=>"ц""\xD0\xA6"=>"Ц""\xD1\x87"=>"ч",
     
    "\xD0\xA7"=>"Ч""\xD1\x88"=>"ш""\xD0\xA8"=>"Ш""\xD1\x89"=>"щ""\xD0\xA9"=>"Щ",
     
    "\xD1\x8A"=>"ъ""\xD0\xAA"=>"Ъ""\xD1\x8B"=>"ы""\xD0\xAB"=>"Ы""\xD1\x8C"=>"ь",
     
    "\xD0\xAC"=>"Ь""\xD1\x8D"=>"э""\xD0\xAD"=>"Э""\xD1\x8E"=>"ю""\xD0\xAE"=>"Ю",
     
    "\xD1\x8F"=>"я""\xD0\xAF"=>"Я"));
    return 
    $s;
    }
     
  2. sultan347

    sultan347

    Регистр.:
    25 апр 2009
    Сообщения:
    230
    Симпатии:
    7
    str_replace("В ",' ',$s);
     
  3. pierrevk

    pierrevk Постоялец

    Регистр.:
    22 сен 2009
    Сообщения:
    59
    Симпатии:
    5
    Спасибо, уже пробовал.
    Не знаю почему, видимо конструкция языка такова.. не работает str_replace как показано выше. Что угодно меняет, а вот   распознает сразу же как конструкцию языка, я так думаю, и менять не хочет!

    И не только неразрывный пробел.
    То же самое касается кавычек, к примеру, значков копирайта итп...
     
  4. swer

    swer

    Регистр.:
    15 июн 2008
    Сообщения:
    308
    Симпатии:
    38
    А таким образом не пробовали переводить
    PHP:
    iconv("utf-8","cp1251",$text)
     
    pierrevk нравится это.
  5. pierrevk

    pierrevk Постоялец

    Регистр.:
    22 сен 2009
    Сообщения:
    59
    Симпатии:
    5
    Вот черт! Столько мучался, а решение - красота! Благодарю, работает!

    Пробовал однажды эту функцию для перевода из кои, или чего-то отличного... она не заработала, дала результат-не фонтан, так скажу. И я на нее забил...

    Спасибо!
     
  6. _AlexSK_

    _AlexSK_ Постоялец

    Регистр.:
    30 окт 2008
    Сообщения:
    59
    Симпатии:
    8
    Я тут где-то в соседней теме уже публиковал функцию, которая перекодирует из win в utf вне зависимости от настроек сервера. Вот аналогичная для перекодировки из utf в win:
    PHP:
    function utf2win($s) {
        if ( 
    function_exists('iconv') ) {
            return 
    iconv("UTF-8""CP1251"$s);
        }
        if ( 
    function_exists('mb_convert_encoding') ) {
            return 
    mb_convert_encoding($s"CP1251""UTF-8");
        }
        
    $i 0$m strlen($s); $t '';
        while ( 
    $i $m ) {
            
    $h ord($s[$i++]);
            if ( 
    $h <= 127 ) { $t .= chr($h); continue; }
            
    $l ord($s[$i++]);
            if ( 
    $h == 208 ) {
                if ( 
    $l >= 144 && $l <= 191 ) { $t .= chr($l+48); continue; }
                if ( 
    $l == 129 ) { $t .= chr(168); continue; } //russion YO
                
    if ( $l == 132 ) { $t .= chr(170); continue; } //ukrainian YE
                
    if ( $l == 134 ) { $t .= chr(178); continue; } //ukrainian YI
                
    if ( $l == 135 ) { $t .= chr(175); continue; } //ukrainian I
                
    continue;
            }
            if ( 
    $h == 209 ) {
                if ( 
    $l >= 128 && $l <= 143 ) { $t .= chr($l+112); continue; }
                if ( 
    $l == 145 ) { $t .= chr(184); continue; };//russion yo
                
    if ( $l == 148 ) { $t .= chr(186); continue; };//ukrainian ye
                
    if ( $l == 150 ) { $t .= chr(179); continue; };//ukrainian yi
                
    if ( $l == 151 ) { $t .= chr(191); continue; };//ukrainian i
                
    continue;
            }
        }
        return 
    $t;
    }
     
  7. pierrevk

    pierrevk Постоялец

    Регистр.:
    22 сен 2009
    Сообщения:
    59
    Симпатии:
    5
    Ребят, в очередной раз взываю о помощи.
    При конвертации из utf в win1251 через iconv у меня случается затык.

    Дело в том, что тексты на французском, немецком, итальянском... У них в utf встречаются символы странные, вроде è, é, ê и тому подобные.

    Подключил использовать str_replace('Ø', 'D', $content) и заменять зловредные символы...

    Но вот затык в чем. наткнулся я на символ Ø.
    он виден совсем криво - отображается на сайте оригинале как Ø, а у меня в обрабатываемом тексте как "Г�". И не могу ничего с ним сделать. Я бы и забыл про него, но когда функция iconv на него натыкается, процесс конвертации останавливается и вся часть текста, подлежащего конвертации, следующего после сего символа теряется.

    Что тут можно поделать?
     
  8. Wertos

    Wertos Постоялец

    Регистр.:
    13 апр 2007
    Сообщения:
    145
    Симпатии:
    27
  9. pierrevk

    pierrevk Постоялец

    Регистр.:
    22 сен 2009
    Сообщения:
    59
    Симпатии:
    5
    Нашел решение простое до ужаса.

    PHP:
    $content=iconv("utf-8","cp1251//TRANSLIT",$content); 
    //TRANSLIT - и все неизвестные символы обрабатываются транслитом без проблем)
     
Статус темы:
Закрыта.