2008-10-06 6 views
25

मेरे पास टेक्स्टरेरा वाला एक फॉर्म है। उपयोगकर्ता टेक्स्ट का एक ब्लॉक दर्ज करते हैं जो डेटाबेस में संग्रहीत होता है।मैं स्ट्रिंग में वर्ड स्मार्ट कोट्स और एम डैश कैसे परिवर्तित करूं?

कभी-कभी कोई उपयोगकर्ता स्मार्ट उद्धरण या emdashes युक्त शब्द से टेक्स्ट पेस्ट करेगा। ,,, € â "€ ™ â € ँ एक एक €

क्या समारोह मैं को इनपुट स्ट्रिंग पर बुलाना चाहिए नियमित डैश लिए नियमित रूप से उद्धरण और emdashes करने के लिए स्मार्ट उद्धरण कन्वर्ट: उन पात्रों के रूप में डेटाबेस में दिखाई देते हैं?

मैं PHP में काम कर रहा हूं।

अद्यतन: अब तक के सभी महान प्रतिक्रियाओं के लिए धन्यवाद। एन्कोडिंग के बारे में जोएल की साइट पर पेज बहुत जानकारीपूर्ण है: http://www.joelonsoftware.com/articles/Unicode.html

मेरी पर्यावरण पर कुछ नोट:

MySQL डेटाबेस उपयोग कर रहा है UTF-8 एन्कोडिंग। इसी तरह, सामग्री प्रदर्शित करने वाले HTML पृष्ठ यूटीएफ -8 (अपडेट :) का उपयोग कर मेटा सामग्री-प्रकार को स्पष्ट रूप से सेट करके कर रहे हैं।

उन पृष्ठों पर स्मार्ट उद्धरण और emdashes प्रश्न चिह्न के साथ हीरे के रूप में दिखाई देते हैं।

समाधान:

प्रतिक्रियाओं के लिए फिर से धन्यवाद। समाधान दुगना था:

  1. यकीन है कि डेटाबेस और HTML फ़ाइलों को स्पष्ट रूप से UTF-8 एन्कोडिंग का उपयोग करने के लिए सेट किए गए थे।
  2. htmlentities() के बजाय htmlspecialchars() का उपयोग करें।

उत्तर

1

हम अक्सर इसके लिए मानक स्ट्रिंग प्रतिस्थापन कार्यों का उपयोग करेंगे। भले ही उस संदर्भ में ASCII/यूनिकोड की प्रकृति बहुत अस्पष्ट है, यह काम करता है। बस सुनिश्चित करें कि आपकी PHP फ़ाइल दाएं एन्कोडिंग प्रारूप में सहेजी गई है, आदि

4

ऐसा लगता है कि वास्तविक समस्या यह है कि आपका डेटाबेस आपके पृष्ठ के समान वर्ण एन्कोडिंग का उपयोग नहीं कर रहा है (जो शायद यूटीएफ -8 होना चाहिए)। उस स्थिति में, यदि कोई उपयोगकर्ता गैर-ASCII वर्ण सबमिट करता है तो आपको शायद डेटाबेस में अजीब वर्ण दिखाई देंगे। उनमें से कुछ को ढूंढना और ठीक करना (घुंघराले उद्धरण और एम डैश) असली समस्या को हल करने वाला नहीं है।

कम से कम एक MySQL डेटाबेस के लिए migrating your database to another character encoding पर कुछ जानकारी दी गई है।

1

मेरे अनुभव में, स्मार्ट कोट्स को स्वीकार करना और यह सुनिश्चित करना आसान है कि आप हर जगह एक ही एन्कोडिंग का उपयोग कर रहे हैं। शुरू करने के लिए, इसे अपने फॉर्म टैग में जोड़ें: accept-charset="utf-8"

1

आप mb_ convert_encoding को ISO-8859-1 से UTF-8 तक आजमा सकते हैं।

$str = mb_convert_encoding($str, 'UTF-8', 'ISO-8859-1'); 

इसका मतलब यह है आप चाहते हैं UTF-8, और ... उचित प्रतिस्थापन पा सकते हैं परिवर्तित, mb_str_replace या उन्हें अपने preg_replace नहीं तो।

2

यह दुर्भाग्य से सर्व-आम समस्या है, PHP के चरित्र सेटों के बहुत खराब प्रबंधन से मदद नहीं की गई है।

क्या हम करते हैं iconv

// Convert input data to UTF8, ignore any odd (MS Word..) chars 
// that don't translate 
$input = iconv("ISO-8859-1","UTF-8//IGNORE",$input); 

//IGNORE ध्वज के माध्यम से पाठ के लिए मजबूर है इसका मतलब है कि कुछ भी है कि अनुवाद नहीं किया जा सकता है दूर फेंक दिया जाएगा।

यदि आप स्ट्रिंग // IGNORE जोड़ते हैं, तो वर्ण वर्णमाला में वर्णित वर्णों को चुपचाप त्याग दिया जाता है।

+1

ऐसा लगता है कि यह एकदम सही "त्वरित सुधार" जैसा लगता है लेकिन दुख की बात है कि यह * अधिक * अमान्य वर्ण जोड़कर मेरे परीक्षण मामले को काफी खराब कर देता है। –

+4

लैटिन 1 से यूटीएफ -8 में कनवर्ट करना केवल तभी समझ में आता है जब आप * जानते हैं कि इनपुट कैरेक्टर सेट लैटिन 1 है। लेकिन यदि इनपुट पहले से ही यूटीएफ -8 है, तो आप लैटिन 1 से इसे "अनुवाद" करके ही इसे गले लगाएंगे दूसरी बार यूटीएफ -8 तक। –

9

mysql डेटाबेस को UTF-8 एन्कोडिंग का उपयोग कर रहा है। इसी प्रकार, एचटीएमएल पेज जो सामग्री प्रदर्शित करता है यूटीएफ -8 का उपयोग कर रहे हैं।

HTML की सामग्री को UTF-8, हाँ में हो सकता है, लेकिन आप स्पष्ट रूप से सामग्री UTF-8 में अपने HTML पृष्ठों के प्रकार (एन्कोडिंग) (पीएचपी के माध्यम से उत्पन्न?) के रूप में अच्छी तरह से स्थापित कर रहे हैं? "text/html;charset=utf-8" के Content-Type हैडर लौटने का प्रयास करें या अपने HTMLs को <meta> टैग जोड़ने:

<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/> 

इस तरह, पीएचपी को प्रस्तुत डेटा की सामग्री प्रकार भी एक ही हो जाएगा।

मुझे एक समान समस्या थी और <meta> टैग मेरे लिए काम किया।

0

यह सर्वोत्तम समाधान नहीं हो सकता है, लेकिन मैं यह जानने के लिए परीक्षण करता हूं कि PHP क्या देखता है। मान लीजिए कि यह "â €" "देखता है (" कुछ अन्य संभावनाएं हैं, जैसे सरल "" "या शायद" & # 8220; ")। फिर डेटाबेस में जवाब भरने से पहले उन सभी से छुटकारा पाने के लिए str_replace करें और सामान्य उद्धरणों के साथ उन्हें प्रतिस्थापित करें।

बेहतर समाधान शायद सभी यूटीएफ -8 को पार करने वाले अंत-टू-एंड डेटा को शामिल करने में शामिल होगा, क्योंकि लोग अन्य उत्तरों में सहायता करने की कोशिश कर रहे हैं।

1

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

अभ्यास में इसका मतलब है एक क्वेरी सेट नाम 'utf8';

http://www.phpwact.org/php/i18n/utf-8/mysql

इसके अलावा, स्मार्ट उद्धरणों windows-1252 वर्ण सेट, नहीं iso-8859-1 (लैटिन -1) का हिस्सा हैं। आपकी समस्या के लिए बहुत प्रासंगिक नहीं है, लेकिन केवल एफवाईआई। यूरो प्रतीक भी वहां है।

1

समस्या mysql charset पर है, मैंने कोड की इस पंक्ति के साथ अपने मुद्दों को ठीक किया है।

mysql_set_charset('utf8',$link); 
+0

यह मेरे लिए भी काम करता है, सीधे उस क्वेरी से ऊपर जोड़ा गया जो 'INSERT'/'UPDATE' चलाता है। बाकी सब कुछ यूटीएफ 8 पर ठीक से सेट किया गया था, टेबल वर्णमाला, कॉलम कॉलेशन, एचटीएमएल आउटपुट पेज। खुशी है कि अंत में यह चाल है! – purefusion

1

आपको व्यक्तिगत स्तंभों को यूटीएफ 8 में मैन्युअल रूप से परिवर्तित करना होगा; डेटाबेस को समग्र रूप से बदलना इन्हें बदल नहीं देगा।

1

तो आप जबकि उनकी उपस्थिति संरक्षण वेब के लिए इन पात्रों से बचने के लिए देख रहे थे, तो अपने तार इस तरह दिखाई देगा: "यह अच्छा है!" बजाय "यह बोरिंग है" ...

आप (PHP के htmlentities के स्थान पर अपने स्वयं के कस्टम htmlEncode समारोह का उपयोग करके) करके ऐसा कर सकते:

$trans_tbl = false; 

function htmlEncode($text) { 

    global $trans_tbl; 

    // create translation table once 
    if(!$trans_tbl) { 
    // start with the default set of conversions and add more. 

    $trans_tbl = get_html_translation_table(HTML_ENTITIES); 

    $trans_tbl[chr(130)] = '&sbquo;'; // Single Low-9 Quotation Mark 
    $trans_tbl[chr(131)] = '&fnof;'; // Latin Small Letter F With Hook 
    $trans_tbl[chr(132)] = '&bdquo;'; // Double Low-9 Quotation Mark 
    $trans_tbl[chr(133)] = '&hellip;'; // Horizontal Ellipsis 
    $trans_tbl[chr(134)] = '&dagger;'; // Dagger 
    $trans_tbl[chr(135)] = '&Dagger;'; // Double Dagger 
    $trans_tbl[chr(136)] = '&circ;'; // Modifier Letter Circumflex Accent 
    $trans_tbl[chr(137)] = '&permil;'; // Per Mille Sign 
    $trans_tbl[chr(138)] = '&Scaron;'; // Latin Capital Letter S With Caron 
    $trans_tbl[chr(139)] = '&lsaquo;'; // Single Left-Pointing Angle Quotation Mark 
    $trans_tbl[chr(140)] = '&OElig;'; // Latin Capital Ligature OE 

    // smart single/ double quotes (from MS) 
    $trans_tbl[chr(145)] = '&lsquo;'; 
    $trans_tbl[chr(146)] = '&rsquo;'; 
    $trans_tbl[chr(147)] = '&ldquo;'; 
    $trans_tbl[chr(148)] = '&rdquo;'; 

    $trans_tbl[chr(149)] = '&bull;'; // Bullet 
    $trans_tbl[chr(150)] = '&ndash;'; // En Dash 
    $trans_tbl[chr(151)] = '&mdash;'; // Em Dash 
    $trans_tbl[chr(152)] = '&tilde;'; // Small Tilde 
    $trans_tbl[chr(153)] = '&trade;'; // Trade Mark Sign 
    $trans_tbl[chr(154)] = '&scaron;'; // Latin Small Letter S With Caron 
    $trans_tbl[chr(155)] = '&rsaquo;'; // Single Right-Pointing Angle Quotation Mark 
    $trans_tbl[chr(156)] = '&oelig;'; // Latin Small Ligature OE 
    $trans_tbl[chr(159)] = '&Yuml;'; // Latin Capital Letter Y With Diaeresis 

    ksort($trans_tbl); 
    } 

    // escape HTML  
    return strtr($text, $trans_tbl); 
} 
0

वास्तव में समस्या PHP में नहीं हो रही है लेकिन यह जावास्क्रिप्ट में हो रहा है, यह शब्द से प्रतिलिपि/पेस्ट के कारण है, इसलिए आपको PHP में अपना टेक्स्ट पास करने से पहले जावास्क्रिप्ट में अपनी समस्या को हल करने की आवश्यकता है, कृपया यह उत्तर https://stackoverflow.com/a/6219023/1857295 देखें।

+0

कृपया उत्तर का प्रासंगिक हिस्सा जोड़ें। – Robert

+0

@ रॉबर्ट ने कहा, "मेरे पास टेक्स्टटेरा के साथ एक फॉर्म है। उपयोगकर्ता डेटाबेस में संग्रहीत टेक्स्ट का एक ब्लॉक दर्ज करते हैं।", इसलिए मेरा मानना ​​है कि इसका मतलब यह है कि वह सामने की ओर (यानी ब्राउज़र) से डेटा पास करने के लिए जावास्क्रिप्ट का उपयोग करता है सर्वर पक्ष (यानी PHP)। उन्होंने कहा, "वर्ड से टेक्स्ट पेस्ट करें", "इनपुट स्ट्रिंग पर मुझे किस फंक्शन पर कॉल करना चाहिए" जिसका मतलब है कि डेटा MySQL में प्रवेश करने से पहले है, इसलिए उस समाधान का उपयोग करने से वह डेटाबेस में उन अजीब पात्रों को पहले स्थान पर ले जाएगा। –

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

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