2012-11-27 9 views
9

हमारी वेबसाइट में, कुछ मैक उपयोगकर्ताओं को परेशानी होती है जब वे पीडीएफ फाइलों से पाठ को टेक्स्टएरिया (TinyMCE द्वारा नियंत्रित) में कॉपी-पेस्ट करते हैं। सभी accentuated char दूषित हैं, और उदाहरण के लिए e?é, i?î आदि के लिए बन गए हैं, मैं इस समस्या को विंडोज कंप्यूटर के साथ पुन: उत्पन्न नहीं कर सकता।PHP: यूनिकोड accentuated char और diacritics

जब मैंने किसी फ़ाइल पर टेक्स्टएरिया की सामग्री (डेटाबेस में डालने से पहले) लिखा था, तो मैंने अभी पाया है कि प्रारंभिक एक परंपरागत é (विम पर, नीचे देखें) दिखाई देता है।

Visual example of the problem

दरअसल

:

// the corrupted é - first line of the screenshot 
echo bin2hex($char); // display 65cc81 

// traditionnal é 
echo bin2hex('é'); // display c3a9 

एक बहुत खोज के बाद, यहाँ मैं हूं: ऐसा लगता है कि मैक ओएस प्रतियां यूनिकोड दो वर्ण का एक संयोजन के रूप में बल वर्ण: हमारे उदाहरण में, e + ́। अब तक, डेटाबेस में e? से बचने के लिए, मुझे दूषित é को वास्तविक के साथ बदलने का कोई समाधान नहीं मिला।

और मैं थोड़ा हताश हूं।

+4

http://unicode.org/reports/tr15/ – hakre

उत्तर

8

normalizing the representation to one form or the other की प्रक्रिया को सामान्य रूप से सामान्यीकृत कहा जाता है।

$input = Normalizer::normalize($input); 

आप संभावना सी, विहित अपघटन विहित संरचना के बाद के लिए फार्म को सामान्य करना चाहते हैं: PHP में वहाँ के माध्यम से यह एक अच्छा विचार है सभी इनपुट भेजने के लिए Normalizer class है,।

क्या कक्षा आपके सिस्टम पर उपलब्ध नहीं होनी चाहिए, Patchwork UTF-8 library है।

+0

हम्म, दिलचस्प, वास्तव में सहेजें। अभी भी मुझे आपके उत्तरों से आश्चर्यचकित कर रहा है ... – shadyyx

+1

यह ध्यान दिया जाना चाहिए कि कोई वास्तविक भ्रष्टाचार नहीं है। विघटित वर्ण पूरी तरह से मान्य हैं। –

+0

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

0

एक TinyMCE विन्यास पैरामीटर है जो आप संपादक में प्रविष्टि से पहले चिपकाया सामग्री पर कार्रवाई करने के एक समारोह परिभाषित करने देता है: paste_preprocessing

कि समारोह का उपयोग करके आप वांछित प्रपत्र

tinyMCE.init({ 
     ... 
     paste_preprocess : function(pl, o) { 
      // Content string containing the HTML from the clipboard 
      o.content = o.content.replace(/\u2020/, 'x'); // example 
     }, 
     paste_postprocess : function(pl, o) { 
      ... 
     }, 
     ... 
}); 
+1

वांछित फॉर्म * संयोजन अनुक्रम के बजाय * सिंगलटन * होगा * क्या आपके पास एक जावास्क्रिप्ट लाइब्रेरी है जो उस से संबंधित है? – hakre

+0

हां, यह tinymce एपीआई है: http://tinymce.moxiecode.com/js/tinymce/docs/api/index.html। लेकिन जावास्क्रिप्ट चरित्र रूपांतरण फ़ंक्शन में साइट व्यवस्थापक द्वारा परिभाषित करने की आवश्यकता है paste_preprocess – Thariama

+0

दिलचस्प, लेकिन wha टी Normalizer वर्ग का नाम है? मैं इसे ढूंढ़ नहीं पाया। – hakre

4
साथ specialchars जगह ले सकता है

यह @dceze पहले से ही उत्तर देने के लिए अतिरिक्त है। यूनिकोड में समान तरीके (समानता की भावना में) वर्ण निर्दिष्ट करने के कई तरीके हैं।

आप एक सामान्य उदाहरण यहाँ है:

65cc81 

कि UTF-8 एन्कोडिंग में दो यूनिकोड कोड पॉइंट्स हैं। 65eलैटिन छोटे अक्षर ई (U + 0065) और cc81 है ́एक्यूट एक्सेंट (U + 0301) (यह आपके ब्राउज़र द्वारा अकेले प्रदर्शित नहीं हो सकता, इसलिए मैं HTML इकाई लिया) के संयोजन है।

यूनिकोड में इसे संयोजन अनुक्रम कहा जाता है। हालांकि किसी कारण से, आपका डेटाबेस इसका समर्थन नहीं करता है। शायद क्योंकि कॉलम का एन्कोडिंग यूटीएफ -8 नहीं है या डेटाबेस कनेक्शन में इसके साथ परेशानी है।

यह धर्मविधान

c3a9 

UTF-8 एन्कोडिंग में एक भी यूनिकोड कोडपॉइंट है कि के बराबर है। c3a9éACUTE (U + 00E9) के साथ लैटिन लघु पत्र ई है। ऐसा लगता है कि आपके डेटाबेस को इससे निपटने में कोई समस्या नहीं है, संभवतः क्योंकि यह डेटाबेस कनेक्शन द्वारा सफलतापूर्वक लैटिन -1/आईएसओ -885 9 -1 को फिर से एन्कोड किया गया है।

तो डेटा को संभालने के दो तरीके दिमाग में आते हैं। यह या तो डेटा के पुन: एन्कोडिंग या डेटा को संग्रहीत करने में समस्या में एक समस्या है।

जब तक आप रचनाकृत यूनिकोड कोडपॉइंट अनुक्रमों की डी-रचना में रुचि रखते हैं, तो आपको Deceze's answer में उल्लिखित सामान्यीकृतकर्ता को लेना चाहिए।

आप यूटीएफ -8 को डेटाबेस में संग्रहीत करने की अनुमति भी दे सकते हैं और फिर आपको कोई समस्या नहीं होनी चाहिए।

इसके अतिरिक्त आपको शायद वैसे भी सामान्य बनाना चाहिए ताकि डेटाबेस या आपके प्रोग्राम में डेटा को सॉर्ट करना और तुलना करना बेहतर काम करता है। जैसा कि आप देख सकते हैं, द्विआधारी अनुक्रम भिन्न होते हैं जो बाइनरी स्तर पर तुलना की गई सभी चीज़ों के लिए समस्याएं पैदा कर सकते हैं।

और यह सुनिश्चित करें, आप कुछ यातायात :)

+0

आपके उत्तर के लिए धन्यवाद। बहुत उपयोगी प्रस्तुति, मैं आपको बहुत धन्यवाद सीखता हूं! :) –

+1

पढ़ने के लिए अच्छा है। इसके अलावा मुझे यह ब्लॉग पोस्ट मिला जो मेरी आंखों में दिलचस्प है: [यूनिकोड सामान्यीकरण] (http://annevankesteren.nl/2009/02/unicode-normalization) - इसमें कुछ और लिंक हैं, कुछ अभी भी काम कर रहे हैं यदि आप खोदना चाहते हैं यूनिकोड भाग के लिए गहराई से। – hakre

+0

लिंक के लिए धन्यवाद। मैं बस इसे पॉकेट-एड करता हूं, और मैं इसे बाद में पढ़ूंगा (सबवे पर :)) –

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