2013-05-11 5 views
16

मैं एक mysql 5.1 सर्वर में एक utf8 charset mysql तालिकाओं का उपयोग कर रहा हूं, जो तालिका में utf8mb4 एन्कोडिंग का समर्थन नहीं करता है। 4-बाइट एन्कोडेड utf8 वर्णों को "","","","","","唧","" जैसे डालने पर। तालिका पॉपअप त्रुटि होगी या निम्न ग्रंथों को छोड़ देगा।क्या php 4-बाइट एन्कोडेड utf8 वर्णों का पता लगा सकता है?

मैं PHP में 4-बाइट एन्कोडेड utf8 वर्णों को प्रोग्रामेटिक रूप से कैसे पहचान सकता हूं और उन्हें प्रतिस्थापित कर सकता हूं?

+0

सुंदर सरल: पात्रों द्वारा एक स्ट्रिंग और यदि 'strlen ($ वर्ण) जाँच == 4' (ऐसा करने के लिए कई तरह से) अलग हो गए। निश्चित नहीं है कि यह वर्णों का पता लगाने का वास्तव में सही तरीका है MySQL संभाल नहीं सकता है, हालांकि कोड बिंदु से जाकर अधिक सटीक हो सकता है। – deceze

+0

क्या आपने [multibyte एक्सटेंशन] (http://php.net/mbstring) की जांच की है? साथ ही, हमेशा [टिप्पणियां पढ़ें] सुनिश्चित करें (http://dk1.php.net/manual/en/function.mb-internal-encoding.php#66568)। –

+0

@deceze यह एक दृष्टिकोण है। अगर मैं अन्य सुरुचिपूर्ण तरीकों से नहीं हूं तो मैं इसके लिए जाऊंगा। –

उत्तर

13

निम्नलिखित नियमित अभिव्यक्ति 4 बाइट UTF-8 वर्णों का स्थान ले लेगा:

function replace4byte($string, $replacement = '') { 
    return preg_replace('%(?: 
      \xF0[\x90-\xBF][\x80-\xBF]{2}  # planes 1-3 
     | [\xF1-\xF3][\x80-\xBF]{3}   # planes 4-15 
     | \xF4[\x80-\x8F][\x80-\xBF]{2}  # plane 16 
    )%xs', $replacement, $string);  
} 

var_dump(replace4byte('d'), replace4byte('dd')); 

यह /u संशोधक पर निर्भर नहीं करता है ताकि आप PCRE होने के लिए UTF-8 के बारे में चिंता करने की जरूरत नहीं होनी चाहिए संकलित। हालांकि, अगर आपके पास यह समर्थन है, तो धोखा preg_replace_callback साफ है।

(Regex Ensuring valid utf-8 in PHP से रूपांतरित)

13

यह काम करना चाहिए:

if (max(array_map('ord', str_split($string))) >= 240) 

तर्कसंगत है कि कोड जा रहा है अप करने के लिए कहते हैं और सहित U + FFFF रूप 1110xxxx 10xxxxxx 10xxxxxx के तीन बाइट्स के रूप में एन्कोड कर रहे हैं। उच्च कोड बिंदु 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx के रूप में हैं, यानी उच्चतम बाइट 240 या उच्चतम का मान है। यदि स्ट्रिंग में ऐसे बाइट्स हैं, तो यह 4-बाइट अनुक्रम के लिए संकेतक है।

आप वर्णों को निकालना चाहते हैं, यह कर देगा: सीधे उच्च कोड पॉइंट्स व्यक्त करने के लिए एक और अधिक सुरुचिपूर्ण regex तरह से हो सकता है

preg_replace_callback('/./u', function (array $match) { 
    return strlen($match[0]) >= 4 ? null : $match[0]; 
}, $string) 

हालांकि।

+0

पहचान के लिए धन्यवाद लेकिन क्या आप इसे एक प्रतिस्थापन उदाहरण के साथ भी पूरा कर सकते हैं? $ a = "omg, मैं अपनी तालिका में नहीं डाल सकता, blahblahblah"; // लक्ष्य $ a == "omg, मैं MYTEXT को मेरी तालिका में नहीं डाल सकता, blahblahblah"; –

संबंधित मुद्दे