Често срещани проблеми с 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;
}
}

VN:F [1.9.22_1171]
Rating: 5.0/5 (1 vote cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)
Често срещани проблеми с encoding при php, 5.0 out of 5 based on 1 rating

6 thoughts on “Често срещани проблеми с encoding при php”

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

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  2. Ако мога и имам възможност ще ти помогна. Сподели какъв е проблема.

    VN:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VN:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  3. Нормално ли е за първия тест да ми извежда:
    [РўРѕРІР° Рµ текст- ЮТФ-8 UTF-8] --- [Това е текст- ЦП1251 UTF-8]
    Ако сменя да конвертира към ЮТФ8, ми извежда:
    [���� � �����- ���-8 Windows-1251] --- [Това е текст- ЦП1251 UTF-8]

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

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  4. Всъщност успях да си реша проблема в сайта, като зададох при конекцията "mysql_query("SET NAMES 'cp1251'");"
    Така вече всичко на сайта е на кирилица, но в базата си стоят омешани нещата.
    Как мога да конвертирам целия архив на базата данни, така че да излезе кирилицата?

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  5. До колкото виждам се опитваш да изведеш UTF8 като 1251 и затова ти излизат тези символи. Другия проблем може да е в това, че си експортнал utf8 като 1251. Успех

    VN:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VN:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  6. Здравейте,
    На посоченият сайт, след прехвърляне на друг хостинг, имам проблем с енкодинга и ми трябва php скрипт, който да конвертира цялата база данни и мисля, че тази функция ще ми свърши работа, но незнам как да я вградя във файл. Новак съм в php, неразбирам достатъчно и след хилядите опити да поправя нещата не постигнах резултат. Вече започвам да се отчайвам.
    Използвам е107CMS на безплатен хостинг при 000webhost.
    Всяка помощ ще е добре дошла и ще съм Ви много благодарен.
    За подробности може да се свържете с мен на имейл.

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)

Вашият коментар

Вашият email адрес няма да бъде публикуван Задължителните полета са отбелязани с *