2011-10-22 11 views
21

यह निश्चित नहीं है कि यह पहली बार कब हुआ था।डेटाबेस पाठ में अजीब अक्षर: Ã, Ã, ¢, â, €,

मेरे पास एक नई ड्रॉप-शिपिंग संबद्ध वेबसाइट है, और थोक व्यापारी से उत्पाद सूची की निर्यात की गई प्रति प्राप्त करें। मैं इसे Prestashop 1.4.4 में प्रारूपित और आयात करता हूं।

वेबसाइट के सामने के छोर उत्पाद पाठ अंदर अजीब पात्रों के संयोजन में शामिल हैं: एक, एक, ¢, एक, आदि वे की तरह आम पात्रों के स्थान पर दिखाई, -: आदि

ये अक्षर डेटाबेस टेबल के लगभग 40% में मौजूद हैं, न केवल उत्पाद विशिष्ट सारणी जैसे ps_product_lang।

Another website thread कहता है यह वही समस्या तब होती है जब डेटाबेस कनेक्शन स्ट्रिंग गलत वर्ण एन्कोडिंग प्रकार का उपयोग करती है।

/config/setting.inc में, कोई वर्ण एन्कोडिंग स्ट्रिंग नहीं है, केवल MySQL इंजन, जो InnoDB पर सेट है, जो मैं PHPMyAdmin में जो देखता हूं उससे मेल खाता है।

मैंने ps_product_lang निर्यात किया, इन वर्णों के सभी उदाहरणों को सही वर्णों से बदल दिया, सीएसवी फ़ाइल को यूटीएफ -8 प्रारूप में सहेजा, और PHPMyAdmin का उपयोग करके उन्हें पुनः आयात किया, यूटीएफ -8 को भाषा के रूप में निर्दिष्ट किया।

हालांकि, PHPMyAdmin में एक नई खोज करने के बाद, अब मेरे साथ शुरू होने से ps_product_lang में इन बुरे पात्रों के कई उदाहरण हैं।

यदि समस्या डेटाबेस कनेक्शन स्ट्रिंग में सही भाषा विशेषता निर्दिष्ट करने के समान सरल है, तो मैं इसे कहां/कैसे सेट करूं, और क्या करना है?

संयोग से, मैं चल PHPMyAdmin में इस आदेश this thread में उल्लेख कोशिश की, लेकिन समस्या बनी हुई है:

SET NAMES utf8 

अद्यतन: PHPMyAdmin का कहना है:

MySQL चारसेट: UTF-8 यूनिकोड (utf8)

यह वही चरित्र सेट है जिसे मैंने अंतिम आयात फ़ाइल में उपयोग किया था, जिसके कारण अधिक चरित्र भ्रष्टाचार हुए। यूटीएफ -8 आयात प्रक्रिया के दौरान आयात फ़ाइल के अक्षर के रूप में निर्दिष्ट किया गया था।

लोग हैं सही मायने में रहने वाले untetheredÃÆ'Ã, ¢ ࢠएक ¢ â,¬Å¡Ã,¬Ã¯à ¢ â:

UPDATE2

यहां एक नमूना है , ÃÆ'à ¢ एक, ऑनलाइन फिल्में खरीदने और किराए पर लेने, सॉफ्टवेयर डाउनलोड करने, और वेब पर फ़ाइलों को साझा और संग्रहीत करना।

Update3

मैं वर्ण सेट प्रदर्शित करने के लिए PHPMyAdmin में एक SQL आदेश भागा:

  • character_set_client UTF8
  • character_set_connection UTF8
  • character_set_database latin1
  • character_set_filesystem बाइनरी
  • character_set_results UTF8
  • character_set_server latin1
  • character_set_system UTF8

तो, शायद मेरी डेटाबेस की जरूरत है UTF-8 में परिवर्तित करने के लिए किया जा (या नष्ट कर दिया और निर्मित)। यदि MySQL सर्वर लैटिन 1 है तो क्या इससे कोई समस्या हो सकती है?

क्या MySQL सामग्री को यूटीएफ 8 के रूप में प्रस्तुत करने का अनुवाद संभाल सकता है लेकिन इसे लैटिन 1 के रूप में संग्रहीत कर सकता है? मुझे नहीं लगता कि यह कर सकता है, क्योंकि यूटीएफ 8 लैटिन 1 का सुपरसेट है। मेरे वेब होस्टिंग समर्थन ने 48 घंटों में जवाब नहीं दिया है। उनके लिए बहुत मुश्किल हो सकता है।

+0

@AurelioDeRosa नमूना ऊपर जोड़ा गया। – Steve

+0

मुझे पश्चाताप का बहुत कुछ पता नहीं है लेकिन ऐसा लगता है कि यह एक अच्छा चार एन्कोडिंग नहीं करता है। वैसे भी मुझे लगता है कि अन्य व्यक्तियों में एक ही समस्या है: http://www.prestashop.com/forums/topic/34545-problem-with-encoding-characters/ –

+0

क्या यह केवल एक एफई समस्या नहीं है? phpMyAdmin गलत एन्कोडिंग में सामान प्रदर्शित करने के लिए सेट है और क्लाइंट UTF-8 का उपयोग करने के लिए सेट नहीं है? एक मेटा टैग में होना चाहिए। – MarianP

उत्तर

5

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

अद्यतन: अपनी अंतिम टिप्पणी के आधार पर, समस्या का मूल यह है कि आपके पास डेटाबेस और डेटा स्रोत (सीएसवी फ़ाइल) है जो विभिन्न एन्कोडिंग का उपयोग करता है। इसलिए आप अपने डेटाबेस को यूटीएफ -8 में परिवर्तित कर सकते हैं या कम से कम, जब आप CSV में मौजूद डेटा प्राप्त करते हैं, तो आपको उन्हें यूटीएफ -8 से लैटिन 1 में परिवर्तित करना होगा।

आप इस लेख निम्नलिखित रूपांतरण कर सकते हैं:

+0

ठीक है। निम्नलिखित पर एक नज़र डालें: http://www.bluebox.net/news/2009/07/mysql_encoding – Steve

+0

कृपया मूल प्रश्न के अपडेट को देखें। – Steve

15

टेबल के चारसेट एक ही है, तो के रूप में यह mysql_set_charset('UTF8', $link_identifier) उपयोग करने के लिए सामग्री की कोशिश है। ध्यान दें कि MySQL UTF8 का उपयोग UTF-8 के बजाय यूटीएफ -8 एन्कोडिंग निर्दिष्ट करने के लिए करता है जो अधिक आम है।

इसी तरह के प्रश्न पर भी my other answer देखें।

+0

जैसा कि आप यहां देख सकते हैं (http://en.wikipedia.org/wiki/UTF-8) ** असली ** नाम यूटीएफ -8 है। लेकिन, ज़ाहिर है, बयान में डैश के बिना हो सकता है। –

+0

@AurelioDeRosa मुझे पता है, लेकिन यह MySQL है जो इसे खराब कर देता है: पी मुझे नहीं ... – AlexV

+0

मुझे दोस्त पता है, चिंता मत करो। यह सिर्फ स्पष्ट करने के लिए है। असल में, जैसा कि आप देख सकते हैं कि मैं कहता हूं "कथन में बिना डैश के हो सकता है"। सादर। –

0

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

अच्छी किस्मत

2

इन दो चीजों को लागू करें।

  1. आप utf8 होने के लिए अपने डेटाबेस की वर्ण सेट सेट करना होगा।

  2. आप फ़ाइल जहां mysql_select_db तरह mysql_set_charset का उपयोग डेटाबेस के चयन के बाद डेटाबेस और अधिकार के साथ कनेक्शन हो जाने में mysql_set_charset('utf8') कॉल करने के लिए की जरूरत है। इससे आप जो भी भाषा में डेटा को सही तरीके से जोड़ और पुनर्प्राप्त कर सकेंगे।

1

यह है कि डेटाबेस फ़ाइल सामग्री की एक डबल UTF8 एन्कोडिंग की वजह से किया गया हो सकता एक UTF8 एन्कोडिंग मुद्दा प्रतीत होता है।

यह स्थिति उस चरित्र सेट के कारण हो सकती है जैसे चरित्र सेट जो था या नहीं चुना गया था (उदाहरण के लिए जब डेटाबेस बैकअप फ़ाइल बनाई गई थी) और फ़ाइल प्रारूप और एन्कोडिंग डेटाबेस फ़ाइल सहेजी गई थी।

मैं इस परिदृश्य में ये अजीब UTF-8 वर्णों देखा है (विवरण पूरी तरह से सटीक रूप में मैं अब सवाल में डेटाबेस के लिए पहुँच नहीं किया जा सकता है):

  • के रूप में मुझे याद है, वहाँ डेटाबेस और टेबल में "uft8_general_ci" संयोजन था।
  • बैकअप डेटाबेस से बना है।
  • यूनिक्स फ़ाइल प्रारूप में और एएनएसआई एन्कोडिंग के साथ विंडोज़ पर बैकअप फ़ाइल खोली गई है।
  • डाटाबेस बैकअप फ़ाइल से phpMyAdmin में सामग्री को प्रतिलिपि बनाकर डेटाबेस को एक नए MySQL सर्वर पर पुनर्स्थापित किया जाता है। फ़ाइल सामग्री में

देख रहे हैं:

  • किसी पाठ संपादक में खुलने एसक्यूएल बैकअप फ़ाइल से पता चलता है कि SQL बैकअप फ़ाइल इस तरह के "sॠ'के रूप में अजीब कैरेक्टर हैं। एक तरफ ध्यान दें, यदि आप एक ही संपादक को दूसरे संपादक में खोलते हैं तो आपको अलग-अलग परिणाम मिल सकते हैं। मैं यहां टेक्स्टपैड का उपयोग करता हूं लेकिन SublimeText में एक ही फ़ाइल खोलने के लिए "sà ¥" कहा जाता है क्योंकि SublimeText सही ढंग से UTF8-फ़ाइल को एन्कोड किया गया है - फिर भी, जब आप PHP में समस्या को ठीक करने का प्रयास करना शुरू करते हैं तो यह थोड़ा उलझन में है क्योंकि आप नहीं देखते हैं पहले SublimeText में सही डेटा। वैसे भी, यह ध्यान में रखकर हल किया जा सकता है कि फ़ाइल सामग्री प्रस्तुत करते समय आपका टेक्स्ट एडिटर किस एन्कोडिंग का उपयोग कर रहा है।
  • अजीब पात्र डबल-एन्कोडेड यूटीएफ -8 वर्ण हैं, इसलिए मेरे मामले में पहला "Ã" भाग "Ã" और "¥" = "¥" (यह मेरा पहला "एन्कोडिंग" है)। यह "à ¥" वर्ण "å" के लिए यूटीएफ -8 वर्ण के बराबर है (यह मेरा दूसरा एन्कोडिंग है)।

तो, मुद्दा यह है कि "गलत" (UTF8 एन्कोड दो बार) utf-8 "सही" utf-8 (केवल UTF8 एन्कोड एक बार) में वापस परिवर्तित किए जाने की आवश्यकता है।

PHP में इसे ठीक करने की कोशिश कर रहा पता चला थोड़ा चुनौतीपूर्ण हो रहे हैं:

utf8_decode() वर्ण प्रोसेस करने में सक्षम नहीं है। ": Iconv(): इनपुट स्ट्रिंग में एक अवैध चरित्र का पता चला सूचना"

// Fails silently (as in - nothing is output) 
$str = "så"; 

$str = utf8_decode($str); 
printf("\n%s", $str); 

$str = utf8_decode($str); 
printf("\n%s", $str); 

iconv() के साथ विफल रहता है।#

$str = "så"; 
echo mb_convert_encoding($str, 'ISO-8859-15', 'UTF-8'); 
// (No output) 

converting the MySQL database characterset and collation to UTF-8 द्वारा MySQL में एन्कोडिंग को ठीक करने की कोशिश कर रहा था असफल:

echo iconv("UTF-8", "ISO-8859-1", "så"); 

एक और fine and possible solution इस परिदृश्य

$str = "så"; 
echo html_entity_decode(htmlentities($str, ENT_QUOTES, 'UTF-8'), ENT_QUOTES , 'ISO-8859-15'); 

mb_convert_encoding() चुपचाप में भी चुपचाप विफल रहता है

ALTER DATABASE myDatabase CHARACTER SET utf8 COLLATE utf8_unicode_ci; 
ALTER TABLE myTable CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

मुझे इस समस्या को हल करने के कुछ तरीके दिखाई देते हैं।

पहला सही एन्कोडिंग के साथ बैकअप बनाना है (एन्कोडिंग को वास्तविक डेटाबेस और तालिका एन्कोडिंग से मेल खाने की आवश्यकता है)। आप टेक्स्ट एडिटर में परिणामस्वरूप SQL फ़ाइल को खोलकर एन्कोडिंग को सत्यापित कर सकते हैं।

दूसरा डबल-यूटीएफ 8-एन्कोडेड वर्णों को एकल-यूटीएफ 8-एन्कोडेड वर्णों के साथ प्रतिस्थापित करना है। यह एक पाठ संपादक में मैन्युअल रूप से किया जा सकता है। इस प्रक्रिया में सहायता के लिए, आप UTF-8 Encoding Debugging Chart से मैन्युअल रूप से गलत वर्ण चुन सकते हैं (यह 5-10 त्रुटियों को बदलने का मामला हो सकता है)।

$str = "så"; 
    // The two arrays can also be generated by double-encoding values in the first array and single-encoding values in the second array. 
    $str = str_replace(["Ã","Â¥"], ["Ã","¥"], $str); 
    $str = utf8_decode($str); 
    echo $str; 
    // Output: "så" (correct) 
0

मैं आज काफी समान समस्या हुई है:

अंत में, एक स्क्रिप्ट प्रक्रिया में सहायता कर सकते हैं mysqldump, दो latin1 पात्रों के रूप में मेरी utf-8 आधार एनकोडिंग utf-8 विशेषक पात्रों फेंक दिया हालांकि फ़ाइल स्वयं नियमित utf8 है।

उदाहरण के लिए: "é" को दो अक्षर "Ã" "के रूप में एन्कोड किया गया था। ये दो वर्ण पत्र के दो बाइट एन्कोडिंग utf8 के अनुरूप हैं लेकिन इसे एक वर्ण के रूप में व्याख्या किया जाना चाहिए।

समस्या को हल करने और किसी अन्य सर्वर पर डेटाबेस को सही तरीके से आयात करने के लिए, मुझे फ़ाइल को ftfy ("फिक्स टेक्स्ट फॉर यू) के लिए खड़ा करना था। (https://github.com/LuminosoInsight/python-ftfy) पायथन लाइब्रेरी। लाइब्रेरी ठीक वही करता है जो मैं अपेक्षा करता हूं: बदलने बुरा एन्कोडेड utf-8 सही ढंग से UTF-8 एन्कोडेड को

उदाहरण के लिए:। यह latin1 संयोजन "एक ©" एक "é" में बदल गया है

ftfy एक कमांड लाइन स्क्रिप्ट के साथ आता है, लेकिन यह बदल देती है। फ़ाइल करें ताकि इसे mysql में वापस आयात नहीं किया जा सके।

मैंने चाल करने के लिए एक पायथन 3 स्क्रिप्ट लिखी:

#!/usr/bin/python3 
# coding: utf-8 

import ftfy 

# Set input_file 
input_file = open('mysql.utf8.bad.dump', 'r', encoding="utf-8") 
# Set output file 
output_file = open ('mysql.utf8.good.dump', 'w') 

# Create fixed output stream 
stream = ftfy.fix_file(
    input_file, 
    encoding=None, 
    fix_entities='auto', 
    remove_terminal_escapes=False, 
    fix_encoding=True, 
    fix_latin_ligatures=False, 
    fix_character_width=False, 
    uncurl_quotes=False, 
    fix_line_breaks=False, 
    fix_surrogates=False, 
    remove_control_chars=False, 
    remove_bom=False, 
    normalization='NFC' 
) 

# Save stream to output file 
stream_iterator = iter(stream) 
while stream_iterator: 
    try: 
     line = next(stream_iterator) 
     output_file.write(line) 
    except StopIteration: 
     break 
संबंधित मुद्दे