Често срещани проблеми с encoding при php

Случвало ли ви се е да имате стринг които е написан с cp1251 и които да искате да конвертирате в utf-8. Най- вероятно да, но случвало ли ви се е да имате стринг които е написан или на cp1251 или на utf-8 предполагам, че на доста няма да им се е налагало затова реших да напиша тази публикация за лесното на следващите след мен.
Имаме стринг „Това е текст“ но незнаем на какъв енкодинг е. Преди да го конвертираме в utf-8 или cp-1251 първо трябва да знаем какъв е и след това е ясно. Ето разиграно решение:

<?php

$s_utf8=iconv(„CP1251″,“UTF-8″,“Това е текст- ЮТФ-8″);
$s_cp1251=“Това е текст- ЦП1251“;

$check1=mb_detect_encoding($s_utf8,’UTF-8,CP1251′);
$check2=mb_detect_encoding($s_cp1251,’UTF-8,CP1251′);

echo „[$s_utf8 <-><b>$check1</b>] – [$s_cp1251 <-> <b>$check2</b>]“;

?>

Ето примерен проблем при конвертиране с iconv:

<?php
iconv(„UTF-8″,“CP1251“,$s_cp1251);
iconv(„CP-1251″,“UTF-8“,$s_utf8);
?>

В горното казваме, че искаме да конвертираме UTF-8 към cp-1251, но това няма как да се реализира понеже стринга е CP1251. Същата тази грешка се получава и при следващото . Именно поради тази причина преди да се конвертира даден стринг към друг енкодинг трябва да се знае какъв е бил преди и какъв да бъде след.

Ето ви две функции за конвертиране от UTF8 към CP1251 и втората отново за конвертиране на CP1251 към UTF8, но с проверка за текущия входящ стринг. При тези две функции може да конвертирате без наличие на iconv.

function cp1251_to_utf8($s)
{
function detect_encoding($string)
{
static $list = array(‘utf-8’, ‘windows-1251′);
foreach ($list as $item)
{
$sample = iconv($item, $item, $string);
if (md5($sample) == md5($string))
return $item;
}
return null;
}

if ( (detect_encoding($s)) == „windows-1251“)
{
$c209 = chr(209); $c208 = chr(208); $c129 = chr(129);
for($i=0; $i<strlen($s); $i++)
{
$c=ord($s[$i]);
if ($c>=192 and $c<=239) $t.=$c208.chr($c-48);
elseif ($c>239) $t.=$c209.chr($c-112);
elseif ($c==184) $t.=$c209.$c209;
elseif ($c==168)    $t.=$c208.$c129;
else $t.=$s[$i];
}
return $t;
}
else
{
return $s;
}
}//End of function cp1251_to_utf8($s)

function utf8_to_cp1251($s)
{
if ((mb_detect_encoding($s,’UTF-8,CP1251’)) == „UTF-8“)
{
for ($c=0;$c<strlen($s);$c++)
{
$i=ord($s[$c]);
if ($i<=127) $out.=$s[$c];
if ($byte2)
{
$new_c2=($c1&3)*64+($i&63);
$new_c1=($c1>>2)&5;
$new_i=$new_c1*256+$new_c2;
if ($new_i==1025)
{
$out_i=168;
} else {
if ($new_i==1105)
{
$out_i=184;
} else {
$out_i=$new_i-848;
}
}
$out.=chr($out_i);
$byte2=false;
}
if (($i>>5)==6)
{
$c1=$i;
$byte2=true;
}
}
return $out;
}
else
{
return $s;
}
}

Категория:

6 отговора

  1. Аватарът на Ben

    Имам проблем с charseta може ли да помогнете , разбира се не фрее
    повече инфо на емаил мога да дам…..

    1. Аватарът на admin

      Ако мога и имам възможност ще ти помогна. Сподели какъв е проблема.

  2. Аватарът на Петър
    Петър

    Нормално ли е за първия тест да ми извежда:
    [РўРѕРІР° Рµ текст- ЮТФ-8 UTF-8] – [Това е текст- ЦП1251 UTF-8]
    Ако сменя да конвертира към ЮТФ8, ми извежда:
    [���� � �����- ���-8 Windows-1251] – [Това е текст- ЦП1251 UTF-8]

    Имам база данни, в която всички кирилски текстове са от сорта „РўРѕРІР° Рµ тексѓ, но на сайта се извеждат нормално.
    Сега прехвърлям сайта на друг сървър, файловете са идентични, базата данни е импортната успешно, но вече на сайта всичко се извежда във въпросителни (така „���� � �����“).
    Какъв може да е проблемът?

    1. Аватарът на Мартин Петров

      До колкото виждам се опитваш да изведеш UTF8 като 1251 и затова ти излизат тези символи. Другия проблем може да е в това, че си експортнал utf8 като 1251. Успех

  3. Аватарът на Петър
    Петър

    Всъщност успях да си реша проблема в сайта, като зададох при конекцията „mysql_query(„SET NAMES ‘cp1251′“);“
    Така вече всичко на сайта е на кирилица, но в базата си стоят омешани нещата.
    Как мога да конвертирам целия архив на базата данни, така че да излезе кирилицата?

  4. Аватарът на Ники

    Здравейте,
    На посоченият сайт, след прехвърляне на друг хостинг, имам проблем с енкодинга и ми трябва php скрипт, който да конвертира цялата база данни и мисля, че тази функция ще ми свърши работа, но незнам как да я вградя във файл. Новак съм в php, неразбирам достатъчно и след хилядите опити да поправя нещата не постигнах резултат. Вече започвам да се отчайвам.
    Използвам е107CMS на безплатен хостинг при 000webhost.
    Всяка помощ ще е добре дошла и ще съм Ви много благодарен.
    За подробности може да се свържете с мен на имейл.

Logged in as {{omniform_current_user_display_name}}. Edit your profile. Log out? Required fields are marked *

Your email address will not be published. Required fields are marked *

Comments are closed.

You must be logged in to post a comment.