2010-12-27 13 views
6

क्या निम्नलिखित वर्ण का पता लगाने के PHP में कोई तरीका है?यूनिकोड अज्ञात " " PHP में वर्ण पहचान

मैं वर्तमान में कुछ अलग-अलग एल्गोरिदम के साथ कई यूटीएफ -8 एन्कोडिंग समस्याओं को ठीक कर रहा हूं और यह पता लगाने में सक्षम होना चाहिए कि स्ट्रिंग में मौजूद है या नहीं। मैं strpos के साथ ऐसा कैसे करूं?

बस मेरे कोडबेस में चरित्र चिपकाने से काम नहीं लगता है।

if (strpos($names['decode'], '?') !== false || strpos($names['decode'], '�') !== false) 
+0

� बजाय –

+0

दुर्भाग्य से नहीं की कोशिश करो। – James

+1

यह गलत दृष्टिकोण है। आप जो कर रहे हैं उसके बारे में आपको और जानकारी जोड़नी चाहिए, आप –

उत्तर

15

का उपयोग कर iconv() का उपयोग करते हुए यूटीएफ -8 स्ट्रिंग को यूटीएफ -8 में कनवर्ट करना एक परिणाम उत्पन्न करता है जहां अवैध यूटीएफ -8 वर्ण गिराए जाते हैं।

इसलिए, आप आइकनव ऑपरेशन से पहले और बाद में स्ट्रिंग की लंबाई की तुलना करके टूटे हुए चरित्र का पता लगा सकते हैं। यदि वे भिन्न होते हैं, तो उनमें एक टूटा चरित्र होता है।

टेस्ट मामले (सुनिश्चित करें कि आप UTF-8 के रूप में फाइल को सेव कर लें):

<?php 

header("Content-type: text/html; charset=utf-8"); 

$teststring = "Düsseldorf"; 

// Deliberately create broken string 
// by encoding the original string as ISO-8859-1 
$teststring_broken = utf8_decode($teststring); 

echo "Broken string: ".$teststring_broken ; 

echo "<br>"; 

$teststring_converted = iconv("UTF-8", "UTF-8//IGNORE", $teststring_broken); 

echo $teststring_converted; 

echo "<br>"; 

if (strlen($teststring_converted) != strlen($teststring_broken )) 
echo "The string contained an invalid character"; 

सिद्धांत रूप में, आप //IGNORE छोड़ सकता है और बस एक असफल (खाली) iconv ऑपरेशन के लिए परीक्षण, लेकिन अन्य हो सकता है आइकन अमान्य वर्णों की तुलना में असफल होने के कारण ... मुझे नहीं पता। मैं तुलना विधि का उपयोग करूंगा।

+0

प्रतिभा :) धन्यवाद! – James

+1

ध्यान दें कि '// IGNORE" विकल्प [libiconv लाइब्रेरी के हाल के संस्करणों में विफल हो सकता है] (http://www.php.net/manual/en/function.iconv.php#108643), लेकिन आप कर सकते हैं इस वर्कअराउंड का उपयोग करें: 'ini_set (' mbstring.substitute_character ', "none"); $ teststring_converted = mb_convert_encoding ($ string, 'UTF-8', 'UTF-8'); ' – Adam

1

जहां तक ​​मुझे पता है, वह प्रश्न चिह्न प्रतीक एक वर्ण नहीं है। मानक फ़ॉन्ट सेट में कई अलग-अलग वर्ण कोड हैं जिन्हें प्रतीक के लिए मैप नहीं किया गया है, और यह डिफ़ॉल्ट प्रतीक है जिसका उपयोग किया जाता है। PHP में पहचान करने के लिए, आपको सबसे पहले यह जानने की आवश्यकता होगी कि आप किस फ़ॉन्ट का उपयोग कर रहे हैं। फिर आपको फ़ॉन्ट कार्यान्वयन को देखने और देखने के लिए कोड मानचित्र की श्रेणियों को "?" प्रतीक, और फिर देखें कि दिया गया चरित्र उन श्रेणियों में से एक में है या नहीं।

+1

असल में, यह एक विशेष चरित्र है: यह यू + एफएफएफडी है, "यूनिकोड रिप्लेसमेंट कैरेक्टर" - यह तब हो सकता है जब कुछ सिस्टम उस बिंदु पर डेटा को डीकोड नहीं कर सके (और उस चरित्र के साथ इसे बदल दिया गया हो) या यदि आप बस नहीं करते हैं फ़ॉन्ट है डेटा को देखने के लिए बेहतर है, और देखें कि आपके पास वास्तव में कौन सा डेटा है। – Thanatos

+0

मुझे लगता है कि मेरा मतलब डेटा के "श्रेणियों" से है जो उचित रूप से डीकोड नहीं करते हैं। – Reinderien

3

यहाँ है कि मैं क्या पता लगाने और UTF-8 में एन्कोड नहीं तार की एन्कोडिंग को सही करने के लिए क्या है, जब वह यह है कि मैं क्या उम्मीद कर रहा हूँ:

$encoding = mb_detect_encoding($str, 'utf-8, iso-8859-1, ascii', true); 
    if (strcasecmp($encoding, 'UTF-8') !== 0) { 
     $str = iconv($encoding, 'utf-8', $str); 
    } 
0

मैं कस्टम विधि (str_replace का प्रयोग करके) अपरिभाषित को साफ़ करने में उपयोग करें अक्षर:

$input='a³'; 

    $text=str_replace("\n\n", "sample000"  ,$text); 
    $text=str_replace("\n", "sample111"  ,$text); 

    $text=filter_var($text,FILTER_SANITIZE_SPECIAL_CHARS, FILTER_FLAG_STRIP_LOW); 

    $text=str_replace("sample000", "<br/><br/>" ,$text); 
    $text=str_replace("sample111", "<br/>"  ,$text); 

    echo $text; //outputs ------------> a3 
संबंधित मुद्दे