2009-05-26 7 views
7

मेरे पास एक MySQL तालिका है जिसमें यूटीएफ -8 प्रारूप में संग्रहीत 120,000 लाइनें हैं। एक फ़ील्ड, उत्पाद का नाम है, जिसमें कई उच्चारण वाले टेक्स्ट हैं। मुझे इसे यूआरएल-फ्रेंडली फॉर्म (एएससीआईआई) में परिवर्तित करने के बाद इस नाम के साथ एक दूसरा फ़ील्ड भरना होगा।iconv स्मार्ट उद्धरण के साथ "अवैध चरित्र" देता है - उनसे कैसे छुटकारा पाएं?

के बाद से पीएचपी सीधे UTF-8 नहीं क्या करता है, मैं उपयोग कर रहा हूँ:

 
$value = iconv ('UTF-8', 'ISO-8859-1', $value); 

ISO-8859-1 करने के लिए नाम, एक बड़े पैमाने पर strstr बयान के बाद परिवर्तित करने के लिए द्वारा किसी भी उच्चारण चिह्न चरित्र को बदलने के लिए इसके असीमित समकक्ष (उदाहरण के लिए, एक बन जाता है)।

हालांकि, मूल पाठ नामों स्मार्ट उद्धरणों के साथ दर्ज किए गए थे, और iconv chokes जब भी यह एक भर आता है - मैं:

 
Unknown error type: [8] 

iconv() [function.iconv]: Detected an illegal character in input string 

iconv उपयोग करने से पहले स्मार्ट उद्धरणों से छुटकारा पाने के लिए, मैं कोशिश की है की तरह तीन बयानों का उपयोग कर:

 
$value = str_replace('’', "'", $value); 

(â € ™ एक UTF-8 स्मार्ट एकल उद्धरण के कच्चे मान है) क्योंकि पाठ फ़ाइल इतने लंबे समय है, इन str_replace के कारण वें ई स्क्रिप्ट हर समय बाहर करने के लिए।

  1. एक UTF-8 स्ट्रिंग से स्मार्ट उद्धरणों (या किसी भी अमान्य वर्ण), iconv चलाने से पहले निकाल देते सबसे तेज़ तरीका क्या है?

  2. या, क्या इस पूरी समस्या का कोई आसान समाधान है? एएससीआईआई में यूटीएफ -8 में, कई उच्चारणों के साथ नाम बदलने के लिए सबसे तेज़ तरीका क्या है, बिना किसी उच्चारण वाले नाम पर, सही वर्तनी है?

+2

क्या आपने iconv() की // ट्रान्सलिट क्षमता की कोशिश की है? यह उच्चारण अक्षरों को उनके पठनीय ASCII समकक्षों में परिवर्तित करना चाहिए। – ceejayoz

+0

मैं प्रलेखन को देख रहा हूं, लेकिन मुझे नहीं लगता कि यह कैसे मदद करेगा - अगर iconv() पहले से ही एक स्मार्ट कोट पर चोक करता है, तो क्या मैं अभी भी चोक नहीं करता अगर मैं // TRANSLIT का उपयोग करता हूं? –

+0

यह आपके "बड़े पैमाने पर स्ट्रस्ट्र स्टेटमेंट" के लिए अधिक है - यही कारण है कि मैंने एक उत्तर के बजाय टिप्पणी की। – ceejayoz

उत्तर

2

"लिंक-फ्रेंडली" से आपका क्या मतलब है? केवल एक तरीका जो मुझे समझ में आता है, क्योंकि <a>...</a> टैग के बीच का पाठ कुछ भी हो सकता है, वास्तव में "यूआरएल-अनुकूल" है, जो एसओ के यूआरएल के समान है जहां सब कुछ [a-z-] में परिवर्तित हो जाता है।

यदि आप यही चाहते हैं, तो आपको एक लिप्यंतरण पुस्तकालय की आवश्यकता होगी, न कि चरित्र सेट रूपांतरण लाइब्रेरी। (मुझे अतीत में काम करने के लिए iconv() प्राप्त करने में कोई भाग्य नहीं मिला है, लेकिन मैंने थोड़ी देर में कोशिश नहीं की है।) बीटा PHP एक्सटेंशन translit है कि probably does the job

यदि आप अपने PHP इंस्टॉल में एक्सटेंशन नहीं जोड़ सकते हैं, तो आपको एक ही PHP लाइब्रेरी की तलाश करनी होगी जो वही काम करता है। मैंने इसका उपयोग नहीं किया है, लेकिन PHP UTF-8 लाइब्रेरी utf8_to_ascii लाइब्रेरी लागू करती है जो मुझे लगता है कि आपको कुछ चाहिए जो आपको चाहिए।

(इसके अलावा, यदि iconv() आपके जैसा विफल रहा है, तो इसका मतलब है कि आपका इनपुट वास्तव में यूटीएफ -8 मान्य नहीं है, इसलिए किसी भी अन्य चीज़ के साथ वैध यूटीएफ -8 को बदलने की कोई भी समस्या समस्या की मदद नहीं करेगी। संपादित करें: मैं इसे वापस ले सकता हूं: यदि ephemient's answer सही है, तो आप जिस आइकनव त्रुटि को देख रहे हैं वह बहुत अच्छी तरह से हो सकता है क्योंकि गंतव्य चरित्र सेट में चरित्र का कोई प्रत्यक्ष प्रतिनिधित्व नहीं है। इसलिए, कभी नहीं।)

+0

मैंने यूआरएल-फ्रेंडली पढ़ने के लिए सवाल बदल दिया। मैं PHP में एक्सटेंशन नहीं जोड़ सकता। मैंने आपके द्वारा सुझाए गए अनुवाद पुस्तकालय की जांच की, लेकिन यह मेरे मूल समाधान की तुलना में लगभग 35% धीमी थी। –

0

क्या आपने MySQL का उपयोग करने पर विचार किया है REPLACE स्ट्रिंग फ़ंक्शन एस्ट्रोफ़ेस में अपमानजनक तारों को बदलने के लिए, या जो भी हो? आप "स्ट्रिंग को प्रतिस्थापित करने" भाग को एक साथ रखने में सक्षम हो सकते हैं उदा। CONCATCHAR कॉल पर उपयोग करके ...

+0

मैंने अपमानजनक तारों को प्रतिस्थापित करने के लिए str_replace का उपयोग करना शुरू कर दिया, लेकिन इसने स्क्रिप्ट को बहुत अधिक धीमा कर दिया ($ value = str_replace ('â € ™', '' '', $ value); जहां का असी प्रतिनिधित्व है स्मार्ट सिंगल कोट को अपमानित करना)। क्या आप CHAR कॉल पर CONCAT द्वारा अपना मतलब बता सकते हैं? –

+0

मैंने एसक्यूएल में रिपब्लिक करने का सुझाव दिया है, और कंकैट (CHAR (...), ... का उपयोग करके उस सबस्ट्रिंग को लिखने के लिए जिसे आप प्रतिस्थापित करने की कोशिश कर रहे हैं, बाइट द्वारा बाइट। –

6

Glibc (और GNU libiconv) supports//TRANSLIT और //IGNORE प्रत्यय।

इस प्रकार, लिनक्स पर, यह सिर्फ ठीक काम करता है:

 
$ echo $'\xe2\x80\x99' 
’ 
$ echo $'\xe2\x80\x99' | iconv -futf8 -tiso8859-1 
iconv: illegal input sequence at position 0 
$ echo $'\xe2\x80\x99' | iconv -futf8 -tiso8859-1//translit 
' 

मुझे यकीन है कि क्या iconv पीएचपी द्वारा उपयोग में है नहीं कर रहा हूँ, लेकिन प्रलेखन का तात्पर्य है कि //TRANSLIT और //IGNORE वहाँ भी काम करेगा।

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