2016-12-21 34 views
1

有了這個代碼,當我填寫漢字成input元素與text類型和名稱text,按提交按鈕,它的展示mb_strlen : 16strlen : 16爲什麼從後期值mb_strlen和strlen是不正確的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 : 2strlen : 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文件編碼起作用,因爲你直接在文件中寫入「漢字」。 – 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我們可以使用正則表達式來檢查,如果輸入的字符串包含非拉丁字符。

代碼:

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

結果:

Array 
(
    [0] => 漢字 
) 

如果我This is a Latin string [email protected]##$&()@!!!測試我得到一個空數組回來。我不認爲這是一個萬無一失的解決方案,但更多的是第一步。

請注意,正則表達式的拉丁字符範圍的定義是U + 0000-U + 007F。這Regex Tutorial Page詳細介紹了Unicode。另請注意,我的模式有一個u標誌,用於Unicode。這將是必要的。

相關問題