Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > UTF8toCP1251($str) Обрезает слово на 7м символе


Автор: DiMoN_TD 5.8.2009, 22:43
Добрый день. Столкнулся вот с какой я проблемой:

Почему-то, когда я пытаюсь декодировать из utf8 в cp1251, то русские слова (которые состоят из 7 букв), все нормально декодируется, зато как только больше букв, то обрезается на 7й букве слово (уже декодированное)

Т.е. если я декодирую из utf8 слово "Асмодей" функцией UTF8toCP1251 , то на выходе и получаю слово "Асмодей", но если я пытаюсь этой же функцией декодировать слово "Асмодейко", то у меня на выходе получает "АсмодейР".

Сама функция:

Код

function UTF8toCP1251($str){ // by SiMM, $table from http://ru.wikipedia.org/wiki/CP1251
  static $table = array("\xD0\x81" => "\xA8", // Ё
                        "\xD1\x91" => "\xB8", // ё
                        // украинские символы
                        "\xD0\x8E" => "\xA1", // Ў (У)
                        "\xD1\x9E" => "\xA2", // ў (у)
                        "\xD0\x84" => "\xAA", // Є (Э)
                        "\xD0\x87" => "\xAF", // Ї (I..)
                        "\xD0\x86" => "\xB2", // I (I)
                        "\xD1\x96" => "\xB3", // i (i)
                        "\xD1\x94" => "\xBA", // є (э)
                        "\xD1\x97" => "\xBF", // ї (i..)
                        // чувашские символы
                        "\xD3\x90" => "\x8C", // Ӑ (А)
                        "\xD3\x96" => "\x8D", // Ӗ (Е)
                        "\xD2\xAA" => "\x8E", // Ҫ (С)
                        "\xD3\xB2" => "\x8F", // Ӳ (У)
                        "\xD3\x91" => "\x9C", // ӑ (а)
                        "\xD3\x97" => "\x9D", // ӗ (е)
                        "\xD2\xAB" => "\x9E", // ҫ (с)
                        "\xD3\xB3" => "\x9F", // ӳ (у)
                       );
  return preg_replace('#([\xD0-\xD1])([\x80-\xBF])#se',
                      'isset($table["$0"]) ? $table["$0"] :
                       chr(ord("$2")+("$1" == "\xD0" ? 0x30 : 0x70))
                      ',
                      $str
                     );
}


С чем это может быть связано?

Автор: WIPS 5.8.2009, 23:10
Попробуй с модификатором для юникода:
Код

'#([\xD0-\xD1])([\x80-\xBF])#use'

вдруг поможет

Автор: DiMoN_TD 5.8.2009, 23:18
WIPS, 
Нет, не помогло, при замене той строки, функция на выходе вообще ничего не выдает :(

Может есть еще какие-то варианты?

Автор: nerezus 5.8.2009, 23:18
http://php.net/iconv ?

Автор: DiMoN_TD 5.8.2009, 23:23
nerezus, 
Установлено

iconv
iconv support                    enabled
iconv implementation    "libiconv"
iconv library version    1.9

Directive    Local Value    Master               Value
iconv.input_encoding    ISO-8859-1    ISO-8859-1
iconv.internal_encoding    ISO-8859-1    ISO-8859-1
iconv.output_encoding    ISO-8859-1    ISO-8859-1

Автор: gcc 5.8.2009, 23:27
substr

substr ($line, 0, 6);

http://us2.php.net/manual/en/function.substr.php

Автор: DiMoN_TD 5.8.2009, 23:31
gcc, это ты про то? smile

Добавлено через 2 минуты и 18 секунд
gcc, пляха муха, а ты прав оказался! smile
Спасибо. Проблема была в том, что я обрезал ненужное кол-во символов (у меня макс. могло находиться 15 символов). Но я не учел, что при перекодировке, символов будет больше, нежели я ввел. Все.. проблема решена! Всем спасибо.

Автор: gcc 5.8.2009, 23:34
убрать все после 7 символа
Обрезает слово на 7м символе

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