Случвало ли ви се е да имате стринг които е написан с 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.
Често срещани проблеми с encoding при php,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;
}
}
Имам проблем с charseta може ли да помогнете , разбира се не фрее
повече инфо на емаил мога да дам…..
Ако мога и имам възможност ще ти помогна. Сподели какъв е проблема.
Нормално ли е за първия тест да ми извежда:
[РўРѕРІР° Рµ текст- ЮТФ-8 UTF-8] --- [Това е текст- ЦП1251 UTF-8]
Ако сменя да конвертира към ЮТФ8, ми извежда:
[���� � �����- ���-8 Windows-1251] --- [Това е текст- ЦП1251 UTF-8]
Имам база данни, в която всички кирилски текстове са от сорта "РўРѕРІР° Рµ тексС", но на сайта се извеждат нормално.
Сега прехвърлям сайта на друг сървър, файловете са идентични, базата данни е импортната успешно, но вече на сайта всичко се извежда във въпросителни (така "���� � �����").
Какъв може да е проблемът?
Всъщност успях да си реша проблема в сайта, като зададох при конекцията "mysql_query("SET NAMES 'cp1251'");"
Така вече всичко на сайта е на кирилица, но в базата си стоят омешани нещата.
Как мога да конвертирам целия архив на базата данни, така че да излезе кирилицата?
До колкото виждам се опитваш да изведеш UTF8 като 1251 и затова ти излизат тези символи. Другия проблем може да е в това, че си експортнал utf8 като 1251. Успех
Здравейте,
На посоченият сайт, след прехвърляне на друг хостинг, имам проблем с енкодинга и ми трябва php скрипт, който да конвертира цялата база данни и мисля, че тази функция ще ми свърши работа, но незнам как да я вградя във файл. Новак съм в php, неразбирам достатъчно и след хилядите опити да поправя нещата не постигнах резултат. Вече започвам да се отчайвам.
Използвам е107CMS на безплатен хостинг при 000webhost.
Всяка помощ ще е добре дошла и ще съм Ви много благодарен.
За подробности може да се свържете с мен на имейл.