[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Функция strlen в строке с кавычкой
Quieteroks
Доброго времени суток.

Столкнулся с необъяснимой проблемой...
Получаю от пользователя POST данные строки, максимальный размер которой не должен превышать 64 символа. Сегодня наткнулись на такую штуку: кавычки в такой строке увеличивают в два раза размер строки...

Обрабатываю примерно так:
1. Сначала все POST данные функцией htmlspecialchars()
2. Потом еще пробую обрабатывать mysql_real_escape_string()
3. Высчитываю длину строки strlen, iconv_strlen или mb_strlen()

Без второго шага пробовал, на третьем шаге все три функции показывают примерно в два раза длинней строку. Тест на 35 символах, из них 2 кавычки, причем не важно, какие.

Что это такое?



Спустя 3 минуты, 20 секунд (29.02.2012 - 10:53) Visman написал(а):
1 делаем только при выводе данных пользователю и только перед самым выводом!
2 делаем только при записи данных в базу!

Спустя 3 минуты, 39 секунд (29.02.2012 - 10:57) Visman написал(а):
Да, strlen используем в вычислениях строк с однобайтными кодировками, а для UTF-8 используем iconv_strlen или mb_strlen.

Спустя 19 секунд (29.02.2012 - 10:57) h234 написал(а):
Потому что htmlspecialchars() преобразует кавычку в """. и strlen вычисляет длину уже не "\"", а """

Спустя 3 минуты, 20 секунд (29.02.2012 - 11:00) Quieteroks написал(а):
h234
Не в два же раза увеличивает размер две кавычки....

Visman
Спасибо, учту.

Спустя 3 минуты, 1 секунда (29.02.2012 - 11:04) h234 написал(а):
$str = "\"";
echo strlen($str); // = 1
$str = htmlspecialchars($str);
echo strlen($str); // = 6

Спустя 3 минуты, 15 секунд (29.02.2012 - 11:07) Quieteroks написал(а):
Visman
Ваши советы помогли только для " такой кавычки.
Если взять «, то все равно строка остается в два раза больше...

h234
35 + 6 + 6 = 47
47 > 64 ?

Функция возвращает 66 символов...

Спустя 3 минуты, 42 секунды (29.02.2012 - 11:10) Visman написал(а):
Quieteroks, т.е.
$str = "«";
echo strlen($str); // != 1

А как вводится такая кавычка? Это же не символ однобайтной кодировке?

Спустя 1 минута, 5 секунд (29.02.2012 - 11:12) h234 написал(а):
Так значит есть в строке и другие спецсимволы, которые преобразуются по аналогии htmlspecialchars

Спустя 2 минуты, 54 секунды (29.02.2012 - 11:14) walerus написал(а):
Для UTF-8
$str = "\"";
echo mb_strlen( $str, 'utf-8'); // = 1

Спустя 1 минута, 58 секунд (29.02.2012 - 11:16) Quieteroks написал(а):
Visman
В исходном коде без изменения такая кавычка интерпретируется. Функция htmlspecialchars() ее и не должна трогать. Только если попробовать str_replace с заменой на специальные символы html.

Я стараюсь везде UTF-8 использовать кодировку, поэтому не знаю.
А для вычисления длины строки взял iconv_strlen

h234
Если бы такие были, то они бы были заменены?
Но в исходном коде нет больше спец символов.

walerus
'utf-8' обязательно дописывать?

Спустя 3 минуты, 25 секунд (29.02.2012 - 11:20) h234 написал(а):
Цитата (walerus @ 29.02.2012 - 08:14)
Для UTF-8
$str = "\"";
echo mb_strlen( $str, 'utf-8'); // = 1

В UTF8 - ASCII, в том числе латинский алфавит, простейшие знаки препинания и арабские цифры кодируются однобайтово, поэтому:
echo strlen("\""); // = 1

Проблема в том, что перед вычислением длины, строка обрабатывается htmlspecialchars

Спустя 1 минута, 13 секунд (29.02.2012 - 11:21) h234 написал(а):
Цитата
Но в исходном коде нет больше спец символов.

Строку в студию

Спустя 5 минут, 8 секунд (29.02.2012 - 11:26) Quieteroks написал(а):
h234
Уже убрал htmlspecialchars перед расчетом.


Первая публикация «Тестовой» статьи
value="Первая публикация «Тестовой» статьи"


Результат 67 символов.

Спустя (29.02.2012 - 11:26) Visman написал(а):
С этой кавычкой хитрющий план
<?php

$str = '«';
echo strlen($str).'<br>';
echo mb_strlen($str).'<br>';

?>

Дает
2
2


Если посмотреть на сохраненный файл, то увидим, что эта кавычка занимает два байта в коде
C2 AB

З.Ы. Файл сохранен в UTF-8

Спустя 1 минута, 40 секунд (29.02.2012 - 11:28) Quieteroks написал(а):
Visman
И все равно: 35 + 2 + 2 != 67
Даже с преобразованием до 6 символов, 67 не получится...

Спустя 3 минуты, 41 секунда (29.02.2012 - 11:32) Visman написал(а):
Все ОК :D
<?php

mb_internal_encoding('UTF-8');

$str = 'ШШ«';
echo strlen($str).'<br>';
echo mb_strlen($str).'<br>';

?>


Результат
6
3

Спустя 1 минута, 37 секунд (29.02.2012 - 11:33) walerus написал(а):
$value = "Первая публикация «Тестовой» статьи";
echo mb_strlen( $value, 'utf-8' );


равно 35 !!!

Спустя 1 минута, 12 секунд (29.02.2012 - 11:34) walerus написал(а):
Quieteroks
У тебя сам скрипт, в какой кодировке сохранен?, надеюсь в utf-8 без BOM...

Спустя 11 секунд (29.02.2012 - 11:35) h234 написал(а):
Да, mb_strlen($str,"UTF-8") работает корректно!

Спустя 7 минут, 14 секунд (29.02.2012 - 11:42) Quieteroks написал(а):
walerus
Да. Все в UTF-8 без BOM. Даже html шаблоны под него закатал.

h234
Да, используя mb_strlen($_POST['value1'],"UTF-8") строка просчиталась нормально.
Проблема решена.
Все из-за кодировки? Заголовок что кодировка UTF-8 в начале индекс файла посылается...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.