2016-12-21 17 views
1

С помощью этого кода, когда я заполняю 漢字 во входной элемент с типом text и имя text и нажмите кнопку отправки, его шоу mb_strlen : 16 и strlen : 16Почему mb_strlen и strlen из значения post неверны? PHP?

<?php 
include("connect.php"); 
if(isset($_POST["submit"])) 
{ 
    $string = mysqli_real_escape_string($db_mysqli,$_POST['text']); 
    //$string = "漢字"; 

    echo $string."<BR>"; 
    echo "mb_strlen : ".mb_strlen($string, 'utf-8')."<BR>"; 
    echo "strlen : ".strlen($string)."<BR>"; 

    if(strlen($string) != mb_strlen($string, 'utf-8')) 
    { 
     echo "Please enter English words only:("; 
    } 
    else 
    { 
     echo "OK, English Detected!"; 
    } 
} 
?> 

<form method="post" ENCTYPE = "multipart/form-data"> 
<input type="text" name="text"> 
<input type="submit" name="submit" value="OK" id="button-blue" style=" float: none; "> 
</form> 

Но при использовании этого кода, это покажет mb_strlen : 2 и strlen : 6

Я хочу знать, почему значение из приведенного выше кода неверно и как подать заявку?

<?php 
    $string = "漢字"; 

    echo $string."<BR>"; 
    echo "mb_strlen : ".mb_strlen($string, 'utf-8')."<BR>"; 
    echo "strlen : ".strlen($string)."<BR>"; 

    if(strlen($string) != mb_strlen($string, 'utf-8')) 
    { 
     echo "Please enter English words only:("; 
    } 
    else 
    { 
     echo "OK, English Detected!"; 
    } 
?> 
+0

Только совет у меня есть: во втором примере роль PHP-File Encoding играет роль, потому что вы пишете '' 漢字 "' непосредственно в файл. – JustOnUnderMillions

+2

И прочитайте здесь отмеченный ответ http://stackoverflow.com/questions/8250709/mb-strlen-strlen-dont-return-correct-values-from-an-ajax-call-to-php – JustOnUnderMillions

+0

Похоже, что данные отправлены вашим клиентом не обрабатывается должным образом как unicode на сервере. – arkascha

ответ

0

Есть, вероятно, некоторые подводные камни с этим ответом-что потребует пересмотра позже, но вместо того, чтобы использовать strlen мы можем использовать Regex для проверки, если строка ввода имеет не-латинские символы.

Код:

$string = '漢字'; 
$matches = array(); 
$pattern = '/^[^\p{Latin}]+$/u'; 
preg_match($pattern, $string, $matches); 
print_r($matches); 

Результаты:

Array 
(
    [0] => 漢字 
) 

Если я тестировал с This is a Latin string [email protected]##$&()@!!! я получаю пустой массив обратно. Я не считаю, что это надежное решение, но более хороший первый шаг.

Обратите внимание, что определение латинского символьного диапазона для Regex равно U + 0000-U + 007F. Это Regex Tutorial Page подробно идет о Unicode. Также обратите внимание, что у моего шаблона есть флаг u, для Unicode. Это необходимо будет включить.