Въпрос относно strlen() и енкодинга

Fill

Registered
Здравейте туристи,
пиша си системка за съобщения към сайта и се натъкнах на следния проблем...идеята ми е да да огранича текста на съобщението до да кажем 500 символа и заглавието на съобщението до 20. Принципно съм си направил ограничение още при самото писане с javascript, но искам да се подсигуря за евентуално изключване на javascripta-а на браузъра на потребителя и да направя проверка непосредствено преди записа в базата.

Ето какво имаме:

1. Станицата ми е utf-8:

HTML:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

2. html формичката:

HTML:
<form action='' method='post' id='msgform'  name='msgform'>
        Subject: <input type='text' style='width:250px' id='msg_title' name='msg_title'  />
        Message: <textarea id='msg_text' name='msg_text' rows='8' cols='40'></textarea>
        <input type='submit' id='write_msg' name='write_msg' value=Write />
</form>

3. И след пост заявката:
PHP:
if(isset($_POST['write_msg'])){
       $msg_title = trim($_POST['msg_title']);
	$msg_text = trim($_POST['msg_text']);
	if(strlen($msg_title)>$fill_settings["max_msg_title"]){
		echo("Максималния брой позволени символи са ".$fill_settings["max_msg_title"].", а вие въвеждате "strlen($msg_title).'<br />');
		$len_to_del = strlen($msg_title) - $fill_settings["max_msg_title"];
		echo("Моля изтрийте ".$len_to_del." символа и опитайте отново<br />");
	}else{
		//дължината е в позволението
	}
}

Въпроса е, че като въеда "Първо съобщение", което реално е 15 символа ми изписва:

Максималния брой позволени символи са 20, а вие въвеждате 29.
Моля изтрийте 9 символа и опитайте отново.

Когато въведа символи на латиница всичко е точно, но когато са на кирилица....един вид space го брои за един символ, а всичко въведено на кирилица го брои за по 2 символа.

Принципно си измислих решение за проблема, преобразувам всичко написано на кирилица на "шльокавица" и след това проверявам дължината. Но ако някой може да ми обясни защо аджеба става така...или пък ако може да ми предложи по-добро решение на този проблем от ще съм благодарен :)
 
Защото UTF-8 ползва 2 байта за 1 буква на кирилица. А strlen брои байтове.

Това, което ти трябва е mb_strlen и изобщо mb_* функциите.
 
Хмм...интересно. Благодаря за разяснението и за функцията, с нея стана много по-лесно и безболезнено :)

+1
 

Back
Горе