Кирилица с $_GET

bunchevi

Registered
Видях много теми по въпроса, но нищо не ми свърши работа. Предавам параметър чрез get и с латинеца няма проблем, но на кирилица не става. Значи направила съм следните неща:
- с Notepad++ съм направила всички файлове да са UTF8 without BOM
- чарсета навсякъде е UTF8
- базата данни и таблицата са utf8_general_ci
но проблема не е в базата данни, проблема е, че когато взема чрез get стойността на пробенливата и нещо явно не декодира правилно. Разпознава кодировката на стойността като UTF8. Правя следното: въвеждам в търсачката -" фаофжоэо" и след като искам да извлека тази стойност с get ми извежда това: � ао� жо� о. В този случай защо разпознава едни букви, а други не? Когато пробвах с htmlentities($find1, ENT_QUOTES, 'UTF-8'); не ми извежда нищо. Когато махна кодировката накрая ми извежда това: Ñ Ð°Ð¾Ñ Ð¶Ð¾Ñ Ð¾ . Пробвах и с iconv('UTF-8','Windows-1251//TRANSLIT',$find1); но тогава ми извежда всички записи от базата данни.
На едно място прочетох нещо за употребата на concat(&, ...); но не помня какво беше точно. Някой чувал ли е за такова решение на проблема? Просто вече незнам какво да направя.
 
Пробвай с urldecode($_GET['var']).

Ако пак не става дай работен пример (test case) за репродуциране на проблема.
 
oniq каза:
С кирилица няма да успееш..
Латиница ЗАДЪЛЖИТЕЛНО!!!!

Айде бе?


@bunchevi, ето това ще работи без проблем. Кодировката на файловете трябва да бъдат ANSI, а не UTF8

Сложил съм ти една функция, която разрешава само букви на кирилица, латиница както цифри и тире -

index.php?get=кирилица
index.php?get=latinica

PHP:
<?php
ini_set('default_charset', 'cp1251'); 
function filter($string) {
	return preg_replace('/[^a-zа-яА-ЯA-Z0-9\s\-]/', '', $string);
}
$_GET = array_map("filter", $_GET);

if(isSet($_GET['get'])) {
	echo $_GET['get'];
} else {
	echo "..опа възникна проблем";
}
//Долното е идентично на тази if/else конструкция
?>

или ..

PHP:
<?php
ini_set('default_charset', 'cp1251'); 
function filter($string) {
	return preg_replace('/[^a-zа-яА-ЯA-Z0-9\s\-]/', '', $string);
}
$_GET = array_map("filter", $_GET);

$test = (empty($_GET['get'])) ? '..опа възникна проблем' : $_GET['get'];
echo $test;
?>
 
PHP:
function toCyr($string){
        setlocale(LC_ALL, 'nl_BG');
        $newString = preg_replace('/[^a-zа-я0-9]/iu', '-', $string);
        
        return $newString;
}

echo toCyr($_GET['...']);

Ето така направи, като си запазиш пак UTF-8.
 
relax4o каза:
PHP:
function toCyr($string){
        setlocale(LC_ALL, 'nl_BG');
        $newString = preg_replace('/[^a-zа-я0-9]/iu', '-', $string);
        
        return $newString;
}

echo toCyr($_GET['...']);

Ето така направи, като си запазиш пак UTF-8.

В Regex няма а-з А-З.

По-правилно е /\W+/ вместо /[^a-zа-я0-9]/iu .
 
alex3 каза:
relax4o каза:
PHP:
function toCyr($string){
        setlocale(LC_ALL, 'nl_BG');
        $newString = preg_replace('/[^a-zа-я0-9]/iu', '-', $string);
        
        return $newString;
}

echo toCyr($_GET['...']);

Ето така направи, като си запазиш пак UTF-8.

В Regex няма а-з А-З.

По-правилно е /\W+/ вместо /[^a-zа-я0-9]/iu .

Имаш право :?:
 
Благодаря на всички за предложенията, но продължава да не става и пак на някои букви ми слага квадратчета и тиренца този път заради preg_replace. Само варианта с ANSI кодирането, което е предложил nom3r1 не съм опитала. Ще опитам и с него сега, но не можах да разбера идеята ви за тази функция с preg_replace която е. Тя какво прави по въпроса с правилното извеждане на кирилица. Аз иначе си имам такава функция която да ми замества непозволени символи с празно място.
 
Точно това прави и при мен филтъра. Замества непозволените символи с празно място.

Тоест кода може да изглежда и така, 'щом си имаш защита на данните:

PHP:
<?php
ini_set('default_charset', 'cp1251'); 
$test = (empty($_GET['get'])) ? '..опа възникна проблем' : $_GET['get'];
echo $test;
?>

както и така

PHP:
<?php
//Горното е идентично на тази if/else конструкция
ini_set('default_charset', 'cp1251'); 
if(isSet($_GET['get'])) {
        echo $_GET['get'];
} else {
        echo "..опа възникна проблем";
}
?>

Като по специалното в кода е
PHP:
ini_set('default_charset', 'cp1251');

Това е главното , което ти трябва.
 
За да няма проблем с кирилица има малко правила.

Asci файл с windows-1251 кодировка
utf8 файл с utf-8 кодировка.

Задължително хедър и мета с обозначена кодировка.

И ако е utf-8 редактора трябва да е "without BOM"
 
Значи аз попринцип съм с варианта с UTF-8 като файловете са запазени с UTF8 без BOM, но сега опитах и с ANSI и windows-1251, но единствената разлика е, че когато напиша на кирилица в търсачката ми изкарва всички резултати, докато с UTF8 извежда някои от буквите с квадрати. Опитах всичко възможно от предложенията, но не тръгва. Дори опитах и htmlentities като задавам да извежда с UTF8 кодировката, но тогава като взима променливата с GET и не ми извежда нищо естествено.
ИНаче съм сложила навсякъде мета тагове, хедъри и тези ini_set сложих. Само не знам дали трябва да слагам хедърите и на php файловете, на които съм сложила в head-a мета тага.
 
Всъщност според мен решението е да се намери как да преобразя get променливата обратно както е била преди да се кодира за урл-то. Опитах с decode, но няма ефект.
 
Става ли когато си взимам get променливата, която в урл-то изглежда така:
search=%D0%A2%D1%8A%D1%80%D1%81%D0%B8,
да я запазя в променлива с htmlentities по следния начин:
Код:
$str=htmlentities($_GET['find'], ENT_QUOTES,"UTF-8");
и след това да търся в базата данни по променливата $str ? Дали ще има някакъв проблем?
По този начин ми се получава, но прави проблем когато на тази функция подам променливата $find1, която съм преобразувала така:
Код:
$find= $_GET['find'];
 $find1 = trim ($find); //като до тук няма проблем
if(!preg_match("/^[a-zA-Zа-яА-Я0-9:'-]$/", $find1))
	  {
	   $find1= preg_replace("/[^a-zA-Zа-яА-Я0-9:'-]/", " ", $find1);
	   $find1= trim($find1);
	  }// и след този код, въпреки че не извършва заместване, спира да ми извежда променливата
 
Решението на проблема е:
Код:
if(!preg_match("/^[a-zA-Z\p{Cyrillic}0-9:\'\s\-]/u", $find4))  
	  {
	   $find4= preg_replace("/[^a-zA-Z\p{Cyrillic}0-9:\'\s\-]/u", " ", $find4); 
	   $find4= trim($find4);
	  } 

echo "<br>".$find4;
Единствения проблем е, че preg_replace филтрира само след първото натискане на "търси", след това пропуска всичко...После като натисна рефреш пак първия път става и после не... Нямам представа защо така става. Ако някой знае къде е грешката моля да каже.
 
bunchevi каза:
Решението на проблема е:
Код:
if(!preg_match("/^[a-zA-Z\p{Cyrillic}0-9:\'\s\-]/u", $find4))  
	  {
	   $find4= preg_replace("/[^a-zA-Z\p{Cyrillic}0-9:\'\s\-]/u", " ", $find4); 
	   $find4= trim($find4);
	  } 

echo "<br>".$find4;
Единствения проблем е, че preg_replace филтрира само след първото натискане на "търси", след това пропуска всичко...

После като натисна рефреш пак първия път става и после не...

Нямам представа защо така става. Ако някой знае къде е грешката моля да каже.

Може би е в самата форма, която си направил/а.
 
bunchevi каза:
Решението на проблема е:
Код:
if(!preg_match("/^[a-zA-Z\p{Cyrillic}0-9:\'\s\-]/u", $find4))  
	  {
	   $find4= preg_replace("/[^a-zA-Z\p{Cyrillic}0-9:\'\s\-]/u", " ", $find4); 
	   $find4= trim($find4);
	  } 

echo "<br>".$find4;
Единствения проблем е, че preg_replace филтрира само след първото натискане на "търси", след това пропуска всичко...После като натисна рефреш пак първия път става и после не... Нямам представа защо така става. Ако някой знае къде е грешката моля да каже.

Каква беше разликата с това, което ти дадох ? Това, че вместо празно място замества с тире ?
 
Всъщност разликата не е в това с какво замества, а в това, че вместо да напиша а-яА-Я сложих \p{Cyrillic} и нямах проблем с кирилицата повече. Иначе и с W+ пак не ми вървеше.
 
Тествах само формата отделно без нищо друго и пак preg_replace не отчита никакви непозволени символи и пропуска всичко. Пробвах како ли не и не става. Да не би да имам синтактична грешка в израза въпреки, че досега навсякъде където съм чела е така както съм го направила и аз.
 

Back
Горе