2013-03-11 2 views
5

У меня есть веб-сайт wordpress.PHP: strlen возвращает длину символа вместо длины байта

Я создал шаблон простой страницы, как:

<?php 
/** 
* Template Name: Test 
*/ 

echo strlen('Привет'); 

?> 

Затем я создал страницу, используя этот шаблон. На странице показана длина русской строки «Привет» (означает «Hello»). Я ожидаю увидеть 12, поскольку кодированная русская строка UTF-8, состоящая из 6 символов, должна иметь размер 12 байт, но вместо этого я получаю 6.

Я тестировал одно и то же на другом сервере и имел правильное значение - 12. Поэтому я считаю, что причиной является конфигурация моего сервера. У меня есть wp 3.2.1 (у меня была такая же проблема после обновления до wp 3.5.1) и PHP 5.3.3.

В настоящее время я провел около 5 дней, пытаясь найти решение, но не повезло. Кто-нибудь знает, в чем причина такого поведения?

+0

Возможный дубликат [Как получить байтовые значения строки в PHP?] (http://stackoverflow.com/questions/591446/how-do-i- get-the-byte-values-of-a-string-in-php) – Neal

+0

@Neal - этот вопрос не имеет ничего общего с ord() –

ответ

1

Вы пытались: http://lt.php.net/manual/en/function.mb-strlen.php?

int mb_strlen (string $str [, string $encoding ]) 
Gets the length of a string. 
+0

Проблема в том, что мне нужно, чтобы strlen работал так, как должен, и возвращал количество байтов. – Vasiliy

0

Вам нужно использовать многобайтовые строковые функции для этого? Например, http://www.php.net/manual/en/function.mb-strlen.php

+1

Кажется, что OP * хочет * количество байтов (не число символов), что и есть ['strlen'] (http://php.net/manual/en/function.strlen.php) вернуться. –

+0

проблема в том, что я не использую mb_strlen. Я знаю, что mb_strlen покажет 6 в моем случае, но почему strlen делает это ... я не знаю ... – Vasiliy

7

Проверьте установку mbstring.func_overload в php.ini. Эта опция позволяет PHP переопределять функцию strlen() с помощью mb_strlen() (и аналогично для других эквивалентов). Это может объяснить расхождение между серверами

EDIT

котирования по ссылке: док

Для использования перегрузки функций, установите mbstring.func_overload в php.ini для положительное значение, что представляет собой комбинацию битмасок с указанием категорий функций, подлежащих перегрузке, с указанием . Он должен быть установлен в 1: , чтобы перегрузить функцию mail(). 2 для строковых функций, 4 для регулярных функций выражения . Например, если установлено значение 7, почта, строки и функции регулярного выражения будут перегружены.

Так значение с 2 bit набором означает, что основные строковые функции будут перегружены с их MBstring эквивалентом, но не по почте или функция регулярных выражений; если вы хотите поведение normal, это должно быть 0

+0

Это правильный (и [* documented *] (http://php.net/manual/ ru/mbstring.overload.php)) ответ. –

+0

Спасибо Джереми, просто добавил ссылку docs на ответ –

+0

У меня есть mbstring.func_overload = "2". Какая должна быть правильная ценность для меня? – Vasiliy

Смежные вопросы