2012-10-11 10 views
28

मेरी स्ट्रिंग में मेरे पास utf-8 गैर-ब्रेकिंग स्पेस (0xc2a0) है और मैं इसे किसी और चीज़ से बदलना चाहता हूं।गैर-ब्रेकिंग utf-8 0xc2a0 space और preg_replace अजीब व्यवहार

जब मैं

$str=preg_replace('~\xc2\xa0~', 'X', $str); 

का उपयोग यह ठीक काम करता है।

लेकिन जब मैं का उपयोग

$str=preg_replace('~\x{C2A0}~siu', 'W', $str); 

नॉन-ब्रेकिंग स्पेस नहीं मिला है (और बदला)।

क्यों? दूसरे regexp के साथ क्या गलत है?

प्रारूप \x{C2A0} सही है, मैंने भी u ध्वज का उपयोग किया।

+0

हो सकता है क्योंकि '$ str' यूनिकोड नहीं है स्ट्रिंग। – YOU

उत्तर

46

वास्तव में PHP में भागने के दृश्यों के बारे में दस्तावेज़ गलत है। जब आप \xc2\xa0 वाक्यविन्यास का उपयोग करते हैं, तो यह यूटीएफ -8 वर्ण की खोज करता है। लेकिन \x{c2a0} वाक्यविन्यास के साथ, यह यूनिकोड अनुक्रम को यूटीएफ -8 एन्कोडेड वर्ण में परिवर्तित करने का प्रयास करता है।

एक गैर ब्रेकिंग स्पेस U+00A0 (यूनिकोड) है लेकिन यूटीएफ -8 में C2A0 के रूप में एन्कोड किया गया है। तो यदि आप ~\x{00a0}~siu पैटर्न के साथ प्रयास करते हैं, तो यह अपेक्षा के अनुसार काम करेगा।

+0

हां, \ x {00a0} काम करता है, धन्यवाद। – DamirR

+1

हाय न्यूबो। आपका जवाब मेरे लिए काम करता था, लेकिन मुझे अभी भी समझ में नहीं आता क्यों। क्या ऐसा इसलिए है क्योंकि मेरा यूटीएफ -8 नहीं है? मेरा डेटा डेटाबेस तालिका से utf8_general_ci वर्ण सेट के साथ आ रहा है, इसलिए यह यूटीएफ -8 होना चाहिए (मेरा character_set_client और character_set_connection भी यूटीएफ -8 है)। क्या आपके पास इस बारे में अधिक जानकारी के लिए एक लिंक है? धन्यवाद। –

+3

[यह आलेख] (http://rrn.dk/the-difference-between-utf-8-and-unicode) इस विषय पर और अधिक समझने के लिए बहुत अच्छा है। यह भी [यह SO सवाल] है (http://stackoverflow.com/questions/3951722/whats-the-difference-between-unicode-and-utf8) जहां पूर्व लेख कॉपी/पेस्ट किया गया है। –

3

दो कोड मेरी राय में अलग-अलग चीजें करते हैं: पहला \ xc2 \ xa0 दो वर्णों, \ xc2 और \ xa0 को कुछ भी नहीं बदलेगा।

UTF-8 एन्कोडिंग में, इस के लिए U + 00A0

\ x {00A0} काम करता है कोडपॉइंट होने के लिए होता है? यह \ xc2 \ xa0

+0

\ x {00a0} काम करता है, धन्यवाद। – DamirR

1

के लिए प्रतिनिधित्व होना चाहिए I इस संस्करण ~\x{c2a0}~siu पर काम नहीं किया।

भिन्न \x{00A0} काम करता है। मैंने दूसरे विकल्प की कोशिश नहीं की है और यहां परिणाम है:

मैंने इसे हेक्स में बदलने की कोशिश की और अंतरिक्ष 0x20 (20) पर नो-ब्रेक स्पेस 0xC2 0xA0 (c2a0) को प्रतिस्थापित करने की कोशिश की।

कोड:

$hex = bin2hex($item); 
$_item = str_replace('c2a0', '20', $hex); 
$item = hex2bin($_item); 
+0

धन्यवाद, काम करता है ... – realmag777

10

मैं aggegate पिछले जवाब है ताकि लोगों को बस कॉपी कर सकते हैं/कोड निम्नलिखित पेस्ट को अपने पसंदीदा विधि का चयन करने के लिए:

$some_text_with_non_breaking_spaces = "some text with 2 non breaking spaces at the beginning"; 
echo 'Qty non-breaking space : ' . substr_count($some_text_with_non_breaking_spaces, "\xc2\xa0") . '<br>'; 
echo $some_text_with_non_breaking_spaces . '<br>'; 

# Method 1 : regular expression 
$clean_text = preg_replace('~\x{00a0}~siu', ' ', $some_text_with_non_breaking_spaces); 

# Method 2 : convert to bin -> replace -> convert to hex 
$clean_text = hex2bin(str_replace('c2a0', '20', bin2hex($some_text_with_non_breaking_spaces))); 

# Method 3 : my favorite 
$clean_text = str_replace("\xc2\xa0", " ", $some_text_with_non_breaking_spaces); 

echo 'Qty non-breaking space : ' . substr_count($clean_text, "\xc2\xa0"). '<br>'; 
echo $clean_text . '<br>'; 
संबंधित मुद्दे