2017-03-25 24 views
3

儘管listing each ISO-8859 character set as an individual encoding,將MBSTRING功能對待每一個ISO-8859字符集互換。爲了驅動點回家:爲什麼mbstring函數錯誤地識別ISO-8859字符串?

$strings = [ 
    'English' => 'Ea vim decore sapientem repudiandae. Sea cu delenit gamu mutn, tic.', 
    'Cyrillic' => 'Лорем ипсум долор сит амет, ин ехерци вереар номинати яуи, сит ин омниум инермис но.', 
    'Greek'  => 'Λορεμ ιπσθμ δολορ σιτ αμετ, ηασ γραεcο νθσqθαμ cθ, εστ θτ εσσε διcαμ qθαλισqθε cθ.', 
    'Armenian' => 'լոռեմ իպսում դոլոռ սիթ ամեթ, եամ նո թաթիոն ծոմպռեհենսամ, իուս ադ նիսլ ոմնիս մինիմ եսթ', 
    'Georgian' => 'ლორემ იფსუმ დოლორ სით ამეთ, ეხ ყუანდო ცოფიოსაე უსუ, იუს ეუ ჰინც ვერო დომინგ ჰის', 
    'Hindi'  => 'वर्ष एसेएवं व्याख्यान संदेश होने लक्षण एसेएवं पहोचाना विचरविमर्श? वर्णन करती आशाआपस अन्तरराष्ट्रीयकरन. रहारुप कार्यसिधान्त', 
    'Korean' => '모든 국민은 보건에 관하여 국가의 보호를 받는다, 전직대통령의 신분과 예우에 관하여는 법', 
    'Arabic' => 'مع لهذه الهجوم عدم, فكان اتفاق الصفحات من أسر. وجزر عُقر أما بـ, عل دار بقسوة المتّبعة بالولايات. وإقامة والفرنسي كل لكل. أي', 
    'Hebrew' => 'עמוד מדינות, חפש ואלקטרוניקה אנתרופולוגיה דת, מה קהילה הקהילה טכנו' 
]; 

$encodings = ['ISO-8859-1', 'ISO-8859-2', 'ISO-8859-3', 'ISO-8859-4', 'ISO-8859-5', 'ISO-8859-6', 'ISO-8859-7', 'ISO-8859-8', 'ISO-8859-9', 'ISO-8859-10', 'ISO-8859-13', 'ISO-8859-14', 'ISO-8859-15' ]; 

foreach($strings as $lang => $text) { 
    echo $lang . " is encoded as " . mb_detect_encoding($text, $encodings) . "\n"; 

    foreach($encodings as $encoding) { 
     echo " - is " . (mb_check_encoding($text, $encoding) ? "" : "not ") . $encoding . "\n"; 
    } 
} 

這將產生輸出的

Hindi is encoded as ISO-8859-1 
    - is ISO-8859-1 
    - is ISO-8859-2 
    - is ISO-8859-3 
    - is ISO-8859-4 
    - is ISO-8859-5 
    - is ISO-8859-6 
    - is ISO-8859-7 
    - is ISO-8859-8 
    - is ISO-8859-9 
    - is ISO-8859-10 
    - is ISO-8859-13 
    - is ISO-8859-14 
    - is ISO-8859-15 

with identical results for every listed language的效果,這顯然是不正確的。

爲什麼每ISO-8859編碼分別MBSTRING名單,但互換對待他們?有什麼方法可靠地檢測正確的規格嗎?

還是我只是濫用這些功能呢?

+0

'mb_detect_encod ing'猜測編碼可能是什麼,這種事情不可能是準確的(並且這個函數沒有太多嘗試),'mb_check_encoding'只是告訴你一個字符串是由一個對給定編碼有效的字節序列。 –

+0

使用'echo $ lang。 「被編碼爲」。 mb_detect_encoding($ text)。 「\ n」;而是。看到其中的差別 – RiggsFolly

+0

@PaulCrovella我明白了......那是相當不幸的:/ – bosco

回答

3

mb_detect_encoding做出猜測,什麼編碼可能是,它是不可能對這種事情是準確的(這個功能並沒有做很多嘗試。)

mb_check_encoding告訴你,如果字符串由對給定編碼有效的字節序列組成,並且在每個ISO-8859- *中,每個可能的字節都是有效的,所以對它們進行驗證是毫無意義的(這些將始終返回true。)

對於相關閱讀我非常建議:The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets

+0

不幸的是,在我對mbstring函數的簡短研究過程中,這篇文章幾次出現在我的搜索結果中,但我從未訪問過它。 O犯了錯誤。o – bosco

+0

它沒有直接解決這個問題,無論是mbstring還是8859,但它確實有助於理解編碼究竟是什麼。再加上在PHP中思考字符串不是一堆字符,而是一堆字節和各種東西會更有意義,並且相關問題將更容易繞開。 –

相關問題