Конец строки в utf-8

NexQ

Новичок
Конец строки в utf-8

Возникла такая проблема, есть текст в utf-8 кодировке с форматированием (символами переноса строк), после конвертации в win-1251 получается непрерывный текст, без переносов. Использую финкцию utf8_win1251 из примеров с этого сайта. Как-нибудь можно решить эту проблему?
 

phprus

Moderator
Команда форума
KIRALEX
Иногда лучше жевать чем говорить. (с) не помню откуда.

Символы \n и \r что в UTF8, что в win1251 представлены одинаково.
 

nehochuha

Новичок
NexQ
дело в том, что UTF8 это гибридная кодировка. т.е там есть и однобайтовые и многобайтовые символы. Он абсолютно совместим с ISO5589-1 и код для \r \n одинаковы для всех...(в том числе и для windows-1251). Опираясь на эту истину делаем вывод о том, что дело в самом тексте перед конвертацией либо с этой функцией. Если можно выложи эту функцию сюда..посмотрим.
 

NexQ

Новичок
Ну текст в формате XML точно имеет форматирование, вот только какие там символы используются для перевода я не знаю, после парсинга XML файла получаю строку в utf формате все еще с форматированием, потом преобразую в win1251 и записываю в БД. Форматирование пропадает на этапе смены кодировки, функция такая:
PHP:
function utf2win1251 ($s)
{
  $out = "";

  for ($i=0; $i<strlen($s); $i++) 
  {
  $c1 = substr ($s, $i, 1);
  $byte1 = ord ($c1);
  if ($byte1>>5 == 6) // 110x xxxx, 110 prefix for 2 bytes unicode
  {
   $i++;
   $c2 = substr ($s, $i, 1);
   $byte2 = ord ($c2);
   $byte1 &= 31; // remove the 3 bit two bytes prefix
   $byte2 &= 63; // remove the 2 bit trailing byte prefix
   $byte2 |= (($byte1 & 3) << 6); // last 2 bits of c1 become first 2 of c2
   $byte1 >>= 2; // c1 shifts 2 to the right

   $word = ($byte1<<8) + $byte2;
   if ($word==1025) $out .= chr(168);
   elseif($word==2028 || $word==2029) $out.="\r\n";                    //  Пытался сам заменять 
   elseif ($word==1105) $out .= chr(184);                // ?
   elseif ($word>=0x0410 && $word<=0x044F) $out .= chr($word-848); // ???
   else
   {  
     $a = dechex($byte1);
     $a = str_pad($a, 2, "0", STR_PAD_LEFT);
     $b = dechex($byte2);
     $b = str_pad($b, 2, "0", STR_PAD_LEFT);
     $out .= "&#x".$a.$b.";";
   }
  }
  else 
  {
   $out .= $c1;
  }
 }

 
 return $out;
}
 

SiMM

Новичок
Если в источнике встречаются не только символы кириллицы - функция работать не будет.

> elseif($word==2028 || $word==2029) $out.="\r\n"; // Пытался сам заменять
Вообще при чём здесь это?

http://ru.wikipedia.org/wiki/Unicode#UTF-8
 

SiMM

Новичок
По-моему Вы пургу несёте, при чём не имеющую отношения ни к кодировке, ни к PHP - учебник по HTML в зубы, и пока не выштудируете - за PHP лучше вообще не беритесь.
http://phpfaq.ru/na_tanke#achtung
PHP:
function hexdump($str) {
  return substr(preg_replace('#.#se','sprintf(".%02X",ord("$0"))',$str),1);
}

echo hexdump(UTF8toWIN1251_entities("\r\n")); // 0D.0A
PHP:
echo hexdump(utf2win1251("\r\n")); // 0D.0A
 

NexQ

Новичок
Автор оригинала: SiMM
По-моему Вы пургу несёте, при чём не имеющую отношения ни к кодировке, ни к PHP - учебник по HTML в зубы, и пока не выштудируете - за PHP лучше вообще не беритесь.
http://phpfaq.ru/na_tanke#achtung
PHP:
function hexdump($str) {
  return substr(preg_replace('#.#se','sprintf(".%02X",ord("$0"))',$str),1);
}

echo hexdump(UTF8toWIN1251_entities("\r\n")); // 0D.0A
PHP:
echo hexdump(utf2win1251("\r\n")); // 0D.0A
Признаю проблема была не в перекодировании, а в xml парсере, тему можно закрыть.
 
Сверху