2010-03-20 3 views
6

Я использую document.getElementById("text").value.length, чтобы получить длину строки через javascript и mb_strlen($_POST['text']), чтобы получить длину строки по PHP, и оба очень сильно отличаются. Возврат каретки преобразуется в javascript до получения длины строки, но я думаю, что некоторые символы не учитываются.Длина строки Javascript отличается от PHP mb_strlen

Например,

[б] 15. Umieszczanie obrazka z logo na stronie zespołu [/ b]

Этот блок текста рассчитан 57 в javascript и 58 в PHP. Когда текст становится длинным, разница увеличивается. Есть ли способ преодолеть это?

+0

Какое кодирование вы работаете с на стороне JavaScript? –

+0

Можете ли вы привести пример с большим количеством различий, чем один (что может быть до подсчета разрывов строк или что-то еще)? Предположительно, чем больше специальных символов, чем «ł» вы используете, разрыв будет расширяться. –

+3

Вы пробовали использовать необязательный второй аргумент для указания кодировки? Я предполагаю, что вы переписали образец нам ascii и что реальной строки нет. – Fredrik

ответ

0

Я заметил, что там есть нестандартный символ (ł). Я не уверен, как PHP считается нестандартным, но он может считать это как два. Что произойдет, если вы запустите тест без этого символа?

+0

Без этого это точно, я уже подозревал, что речь идет о кодировании ... Есть ли эквивалентная функция для Javascript? – TheOnly92

+0

@ TheOnly92, почему вы хотите исправить это, в конце концов, это уже правильно? Разве не лучше сказать концу PHP, как правильно рассчитать длину (см. Комментарий Матфея к вашему вопросу). – Fredrik

+0

Дело в том, что моя сортировка базы данных не учитывает utf8, я думаю, он считает эти длины символов как 2 ... – TheOnly92

1

Я нашел mb_strlen эквивалентной функции Javascript, может быть, это может быть полезным для кого-то еще:

function mb_strlen(str) { 
    var len = 0; 
    for(var i = 0; i < str.length; i++) { 
     len += str.charCodeAt(i) < 0 || str.charCodeAt(i) > 255 ? 2 : 1; 
    } 
    return len; 
} 

Спасибо всем, что пытались помочь!

+0

Кто знал, что многобайтовые символы были закодированы с использованием 3 байтов ?! Первый раз я слышал об этом. –

+0

@PP Это, конечно, некорректно, и функция будет работать только для миксов символов либо в диапазоне 0-127, либо в наборе символов, который не подходит по два. Я действительно вещь @ TheOnly92 должна решить это правильно. – Fredrik

+0

-1. 'U' принимает 2 байта в UTF-8. – kennytm

4

Если вы пытаетесь получить длину UTF-8 закодированной строки в PHP, вы должны указать кодировку во втором параметре mb_strlen, например, так:

mb_strlen($_POST['text'], 'UTF-8') 

Кроме того, не забудьте позвонить stripslashes на POST-var.

0

Это должно сделать трюк

function mb_strlen (s) { 
    return ~-encodeURI(s).split(/%..|./).length; 
} 
Смежные вопросы