Microsoft Excel .csv फ़ाइलों में Diacritics का प्रबंधन करता है?


190

मैं प्रोग्रामेटिक रूप से डेटा का निर्यात कर रहा हूँ (PHP 5.2 का उपयोग करके) .csv परीक्षण फ़ाइल में।
उदाहरण डेटा: Numéro 1(उच्चारण ई पर ध्यान दें)। डेटा utf-8(प्रीपेड BOM नहीं है)।

जब मैं इस फ़ाइल को MS Excel में खोलता हूँ तो यह प्रदर्शित होती है Numéro 1

मैं इसे एक टेक्स्ट एडिटर (अल्ट्राएडिट) में खोलने में सक्षम हूं जो इसे सही ढंग से प्रदर्शित करता है। UE की रिपोर्ट चरित्र है decimal 233

मैं एक .csv फ़ाइल में पाठ डेटा कैसे निर्यात कर सकता हूं ताकि एमएस एक्सेल इसे सही ढंग से प्रस्तुत कर सके, अधिमानतः आयात विज़ार्ड, या गैर-डिफ़ॉल्ट विज़ार्ड सेटिंग्स के उपयोग के बिना?


मुझे आपके BOM समाधान के बारे में अधिक सुनने में बहुत दिलचस्पी होगी, जैसा कि मुझे लगता है कि मैंने "EF BB BF" की कोशिश की है जो मेरे लिए काम नहीं करता है।
जेम्स बेकर

3
चुना गया कार्य समाधान इस प्रकार था: * एक बीओएम शामिल करें; utf-8 * इस हेडर का उपयोग करें: 'सामग्री-प्रकार: पाठ / सादा; charset = utf-8 'यह "काम किया" एक्सेल 2003 में और एक्सेल 2007 - जहां काम किया = आयात विज़ार्ड के बिना खोला और सही ढंग से डायक्ट्रीक्स प्रदान किया। मैंने यह सत्यापित नहीं किया कि BOM की आवश्यकता थी।
20

2
BOM की आवश्यकता है, मैंने अभी इसका परीक्षण किया है। इसके बिना विशेष वर्ण ठीक प्रस्तुत नहीं करते हैं।
एलेक्स क्रिमिनियन

2
अगर किसी को बीओएम (बाइट-ऑर्डर मार्कर) जोड़ने के तरीके के बारे में अधिक कहा जा सकता है तो उसे बहुत अच्छा लगेगा। अगर मैं सिर्फ रिस्पांस की तरह कुछ करता हूं। तो (EF BB BF ") उन पात्रों को सिर्फ फ़ाइल की शुरुआत में दिखाया जाता है।
sydneyos

sydneyos: जैसा कि फर्गेल नीचे कहते हैं; अपने स्ट्रिंग के लिए पूर्व-निर्धारित करें।
noocyte

जवाबों:


243

सही ढंग से स्वरूपित UTF8 फ़ाइल में पहले तीन ऑक्टेट के रूप में बाइट ऑर्डर मार्क हो सकता है । ये हेक्स मान 0xEF, 0xBB, 0xBF हैं। ये ऑक्टेट फ़ाइल को UTF8 के रूप में चिह्नित करने का काम करते हैं (क्योंकि वे "बाइट ऑर्डर" जानकारी के रूप में प्रासंगिक नहीं हैं)। 1 यदि यह BOM मौजूद नहीं है, तो उपभोक्ता / पाठक को पाठ के एन्कोडिंग प्रकार का अनुमान लगाने के लिए छोड़ दिया जाता है। पाठक जो UTF8 में सक्षम नहीं हैं, वे बाइट्स को कुछ अन्य एन्कोडिंग जैसे Windows-1252 के रूप में पढ़ेंगे और फ़ाइल के शुरू में वर्ण प्रदर्शित करेंगे ।

एक ज्ञात बग है जहां एक्सेल, फ़ाइल एसोसिएशन के माध्यम से UTF8 CSV फ़ाइलों को खोलने पर, मान लेता है कि वे एकल-बाइट एन्कोडिंग में हैं, UTF8 BOM की उपस्थिति की उपेक्षा करते हैं। यह किसी भी सिस्टम डिफ़ॉल्ट कोडपेज या भाषा सेटिंग द्वारा तय नहीं किया जा सकता है। BOM एक्सेल में सुराग नहीं करेगा - यह सिर्फ काम नहीं करेगा। (एक अल्पसंख्यक रिपोर्ट का दावा है कि BOM कभी-कभी "आयात पाठ" विज़ार्ड को ट्रिगर करता है।) यह बग Excel 2003 और उससे पहले मौजूद है। अधिकांश रिपोर्ट (यहां के जवाबों के बीच) में कहा गया है कि यह एक्सेल 2007 और नए में तय है।

ध्यान दें कि आप हमेशा "सही ढंग से आयात पाठ" विज़ार्ड का उपयोग करके Excel में UTF8 CSV फाइलें खोल सकते हैं, जो आपको आपके द्वारा खोले जाने वाले फ़ाइल के एन्कोडिंग को निर्दिष्ट करने की अनुमति देता है। बेशक यह बहुत कम सुविधाजनक है।

इस उत्तर के पाठकों को ऐसी स्थिति में सबसे अधिक संभावना है, जहां वे विशेष रूप से एक्सेल <2007 का समर्थन नहीं करते हैं, लेकिन एक्सेल को कच्चा UTF8 टेक्स्ट भेज रहे हैं, जो इसे गलत तरीके से व्याख्या कर रहा है और आपके पाठ को Ãअन्य समान Windows-1252 वर्णों के साथ छिड़क रहा है । UTF8 BOM को जोड़ना संभवतः आपका सबसे अच्छा और त्वरित फिक्स है।

यदि आप पुराने एक्सेल पर उपयोगकर्ताओं के साथ फंस गए हैं, और एक्सेल आपके CSV का एकमात्र उपभोक्ता है, तो आप UTF8 के बजाय UTF16 को निर्यात करके इसके आसपास काम कर सकते हैं। एक्सेल २००० और २००३ इन पर सही तरीके से डबल-क्लिक करेंगे। (कुछ अन्य पाठ संपादकों के पास UTF16 के साथ समस्याएँ हो सकती हैं, इसलिए आपको अपने विकल्पों को सावधानीपूर्वक तौलना पड़ सकता है।)


* सिवाय इसके कि जब आप नहीं कर सकते, (कम से कम) एक्सेल 2011 मैक के इंपोर्ट विजार्ड के लिए, वास्तव में हमेशा सभी एनकोडिंग के साथ काम नहीं करता है, भले ही आप इसे बताएं। </ किस्सा-सबूत> :)


14
एन्कोडिंग निर्दिष्ट करने के लिए मुझे हमेशा के लिए ढूंढ लिया। डायलॉग> टूल बटन> वेब विकल्प> टैब एन्कोडिंग सहेजें। वे सुनिश्चित करते हैं कि इस तरह की महत्वपूर्ण चीजें छुपाना अच्छा है।
त्रिनको

6
गलत: UTF-8 फ़ाइल में BOM जोड़ने से Excel 2007 में आयात विज़ार्ड की आवश्यकता के बिना सही ढंग से फ़ाइल लोड होती है।
विक्टर निकोलेट

3
हमें वही बात मिली जो आज विक्टर कहते हैं (एक्सेल 2010 का उपयोग करके, यह सब हमारे पास उपलब्ध है)। UTF-8 BOM / हस्ताक्षर (EF BB BF) जोड़ना सिस्टम डिफ़ॉल्ट एन्कोडिंग का उपयोग करके डबल-क्लिक को ठीक करने के लिए प्रतीत होता है, और सही ढंग से UTF8 का उपयोग करता है :)
डैनी टूपेनी

20
सामान्य तौर पर , UTF-8-एन्कोडेड फ़ाइल में बाइट ऑर्डर मार्क नहीं होना चाहिए । UTF-8 में वैरिएबल बाइट ऑर्डर नहीं है, और इसे वहां डालने पर UTF-8 के ASCII संगतता में खराबी आती है। कुछ विशिष्ट फ़ाइल प्रारूप हैं जो या तो UTF-8 फ़ॉक्स-बीओएम को अनुमति देते हैं या प्रोत्साहित करते हैं, लेकिन अन्यथा इसे टाला जाना चाहिए। CSV पूरी तरह से एन्कोडिंग-अज्ञानी है इसलिए यह किसी का अनुमान है कि क्या कोई दिया गया उपकरण बाइट अनुक्रम 0xEF 0xBB 0xBF को UTF-8 के संकेतक के रूप में व्याख्या करेगा; पहली सेल में एक अदृश्य नियंत्रण चरित्र; पहली सेल में पात्र ; या कुछ और पूरी तरह से।
बोबिन्स

3
@ इयान: यह सुनिश्चित करने के लिए किसी को भी पता नहीं है कि यह एक बीओएम के साथ यूटीएफ -8 है - 0xEF 0xBB 0xBF अधिकांश विरासत एन्कोडिंग में भी एक वैध अनुक्रम है (इसलिए इसे अक्सर ISO-8179-1 या cp1252 के रूप में गलत तरीके से दिखाया गया है और जैसा प्रदर्शित किया गया है )। यह केवल एल्गोरिदम का अनुमान लगाने में मदद करता है, और फ़ाइल स्वरूपों के लिए जो विशेष रूप से इसके लिए भत्ते बनाते हैं (जैसे एक्सएमएल)। UTF-8 फ़ाइलों में एक अशुद्ध-BOM शामिल करने के लिए नकारात्मक पक्ष यह है कि आप उनकी ASCII-संगतता (UTF-8 के लिए एक प्रमुख विक्रय बिंदु) को तोड़ते हैं। कई एन्कोडिंग-अज्ञानी पाठ उपकरण एक अप्रत्याशित अग्रणी अशुद्ध-BOM के साथ सामना करेंगे।
बॉब

39

एक BOM (\ uFEFF) को प्रस्तुत करना मेरे लिए (एक्सेल 2007) में काम किया, उस एक्सेल में फ़ाइल को UTF-8 के रूप में मान्यता दी। अन्यथा, इसे सहेजना और आयात विज़ार्ड का उपयोग करना काम करता है, लेकिन कम आदर्श है।


1
यह अभी भी पाठ आयात विज़ार्ड खोलता है, इसलिए अंतर यह है कि आप बस डबल क्लिक कर सकते हैं, इसलिए अभी भी आदर्श नहीं है, लेकिन वैसे भी एकमात्र ज्ञात समाधान।
22

मेरे लिए, Excel 2007 के साथ कोई आयात विज़ार्ड दिखाई नहीं देता है।
विक्टर निकोलेट

मेरे लिए कोई आयात विज़ार्ड भी नहीं है - यह अपेक्षा के अनुसार काम करता है यदि कोई UTF8 BOM / हस्ताक्षर (EF BB BF) मौजूद है।
डैनी टुप्नेनी

इसके अलावा, \ufeffएक यूटीएफ -16 (बीई) बीओएम नहीं एक यूटीएफ -8 बीओएम है
एलेस्टेयर मैककॉर्मैक

2
नहीं, @AlastairMcCormack, यह या तो यह निर्भर करता है कि यह एन्कोडेड कैसे है। "\ ufeff" UTF-8 के रूप में एन्कोड किया गया, बिल्कुल EF BB BF है। (UTF-16 के रूप में एन्कोडेड यह सिर्फ दो बाइट्स होगा।)
डेव बर्ट

30

उपयोगकर्ता को Microsoft Excel भेजते समय नीचे दिए गए PHP कोड का उपयोग मैं अपने प्रोजेक्ट में कर रहा हूँ:

  /**
   * Export an array as downladable Excel CSV
   * @param array   $header
   * @param array   $data
   * @param string  $filename
   */
  function toCSV($header, $data, $filename) {
    $sep  = "\t";
    $eol  = "\n";
    $csv  =  count($header) ? '"'. implode('"'.$sep.'"', $header).'"'.$eol : '';
    foreach($data as $line) {
      $csv .= '"'. implode('"'.$sep.'"', $line).'"'.$eol;
    }
    $encoded_csv = mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
    header('Content-Description: File Transfer');
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment; filename="'.$filename.'.csv"');
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: '. strlen($encoded_csv));
    echo chr(255) . chr(254) . $encoded_csv;
    exit;
  }

अद्यतन: फ़ाइल नाम में सुधार और बग सही लंबाई गणना को ठीक करते हैं। TRiG और @ ivanhoe011 के लिए धन्यवाद


1
मैंने इस पृष्ठ पर कई अन्य सुझावों की कोशिश की, लेकिन इसने मेरे लिए एक्सेल 2007 में काम किया। सबसे महत्वपूर्ण बदलाव कॉमा के बजाय टैब का उपयोग करना था (भले ही यह एक .csv फ़ाइल है) और उस लाइन के ऊपर दो अक्षर के बाद इको। mb_convert_encoding () को कॉल करें। मुझे mb_convert_encoding () के लिए समर्थन प्राप्त करने के लिए --enable-mbstring के साथ PHP को फिर से जोड़ना पड़ा। धन्यवाद!
रसेल जी

1
इसने मेरे लिए भी अच्छा काम किया, धन्यवाद। हालाँकि, सफ़ारी में मुझे मेरे कंसोल में एक त्रुटि मिलती है 'संसाधन को दस्तावेज़ के रूप में व्याख्या किया गया है लेकिन इसे इस रूप में स्थानांतरित किया गया है ...' मुझे लगता है कि यह एक WebKit quirk है, जो stackoverflow.com/questions/3899426/… को पहचानता है , लेकिन शायद ऐसा नहीं है और / या कोई व्यक्ति एक समाधान मिला। इसके अलावा, आपके उदाहरण में मैं एक बदलाव का सुझाव 'Content-Disposition: attachment; filename="'.$filename.'.csv"'दूंगा : क्योंकि फ़ायरफ़ॉक्स डबल कोट्स चाहता है, अन्यथा यह एक स्थान के बाद आपके फ़ाइल नाम को काट देगा।
कासिमिर

आप CSV ( text/csv) को एक्सेल क्यों कर रहे हैं application/vnd.ms-excel?
टीआरजी

2
यह महान काम करता है! मैं इसकी पुष्टि कर सकता हूं कि यह मैक पर (ऑफिस 2011 में) काम कर रहा है।
जोनाथन

यह नहीं होना चाहिए header('Content-Length: '. mb_strlen($encoded_csv, 'UTF-16LE'));?
रिच ब्रैडशॉ

13

एक्सेल संस्करण (2003 + 2007) और फ़ाइल प्रकारों के सभी संयोजनों का उत्तर

यहां अधिकांश अन्य उत्तर केवल उनके एक्सेल संस्करण की चिंता करते हैं और जरूरी नहीं कि वे आपकी मदद करें, क्योंकि उनका उत्तर सिर्फ आपके एक्सेल के संस्करण के लिए सही नहीं हो सकता है।

उदाहरण के लिए, BOM वर्ण जोड़ने से स्वचालित स्तंभ विभाजक मान्यता के साथ समस्याएं आती हैं, लेकिन हर Excel संस्करण के साथ नहीं।

3 चर हैं जो निर्धारित करते हैं कि यह सबसे एक्सेल संस्करणों में काम करता है:

  • एन्कोडिंग
  • BOM चरित्र उपस्थिति
  • कोशिका विभाजक

SAP के किसी व्यक्ति ने हर संयोजन की कोशिश की और परिणाम की सूचना दी। अंतिम परिणाम? BOM और टैब कैरेक्टर के साथ UTF16le को अलग एक्सेल वर्जन में काम करने के लिए सेपरेटर के रूप में उपयोग करें।

तुम मुझ पर विश्वास नहीं करते? मैं या तो नहीं करूँगा, लेकिन यहाँ पढ़ता हूँ और रोता हूँ: http://wiki.sdn.sap.com/wiki/display/ABAP/CSV+tests+of+encoding+and+column+separator


सिर्फ जोड़ना sep=,या जो भी आप उपयोग करना चाहते हैं वह क्यों नहीं ? यदि आप पहले से ही बीओएम जोड़ रहे हैं, तो मुझे लगता है कि आप फ़ाइल में सामान जोड़ने का विरोध नहीं कर रहे हैं।
केसी

ठीक है, वास्तव में, मेरे अपने प्रश्न का उत्तर देने के लिए, आप क्षेत्र विभाजक घोषणा को नहीं जोड़ेंगे क्योंकि यह इस चाल को काम करना बंद कर देता है। इसलिए मूल रूप से यह एन्कोडिंग है या आपकी फ़ाइल को CSV के रूप में ठीक से व्याख्या नहीं की जा रही है यदि आपके उपयोगकर्ताओं के पास गलत क्षेत्र सेटिंग्स हैं।
केसी

1
utf-16le + BOM (0xFF 0xFE) + टैब सबसे अच्छा है
zhaozhi

10

आयात करते समय UTF-8 का चयन करें। यदि आप Office 2007 का उपयोग करते हैं, तो आपने इसे चुना है: फ़ाइल खोलने के ठीक बाद।


1
यह उपयोगी है। मैंने इस सवाल को संशोधित किया है कि जादूगर का सहारा लिए बिना यह कैसे किया जाए
Freddo411

9

सीएसवी डेटा के उत्पादन से पहले इको यूटीएफ -8 बीओएम। यह विंडोज़ के सभी चरित्र मुद्दों को ठीक करता है लेकिन मैक के लिए काम नहीं करता है।

echo "\xEF\xBB\xBF";

यह मेरे लिए काम करता है क्योंकि मुझे एक फाइल उत्पन्न करने की आवश्यकता है जिसका उपयोग केवल विंडोज पीसी पर किया जाएगा।


हर प्रकार के कॉलम विभाजक और न ही प्रत्येक एक्सेल संस्करण के लिए सही नहीं है। मेरा जवाब नीचे (अभी के लिए नीचे) पढ़ें।
क्रिस्टियान वेस्टरबेक

7

UTF-8 किसी भी सर्विस पैक के बिना, BOM (U + ffef या 0xEF, 0xBB, 0xBF, न तो काम करता है) के बिना ऑफिस 2007 में मेरे लिए काम नहीं करता है। sp3 को स्थापित करने पर UTF-8 काम करता है जब 0xEF, 0xBB, 0xBF BOM है prepended।

UTF-16 तब काम करता है जब 0xff 0xef BOM के साथ "utf-16-le" का उपयोग करते हुए अजगर में एन्कोड किया जाता है, और सेपरेटर के रूप में टैब का उपयोग किया जाता है। मुझे मैन्युअल रूप से BOM लिखना था, और फिर "utf-16-le" का उपयोग करना था, बल्कि "utf-16", अन्यथा प्रत्येक एनकोड () ने BOM को प्रत्येक पंक्ति में लिखा था जो पहले कॉलम के कचरा के रूप में दिखाई दिया था। दूसरी पंक्ति और उसके बाद।

यूटीएफ -16 किसी भी बीपी के बिना काम नहीं करेगा, क्योंकि मैं अब वापस नहीं जा सकता। आह

यह विंडोज़ पर है, मैक के लिए कार्यालय के बारे में पता नहीं है।

दोनों कार्य मामलों के लिए, आयात ब्राउज़र से सीधे डाउनलोड शुरू करते समय काम करता है और पाठ आयात विज़ार्ड इंटरवेंस नहीं करता है, यह काम करता है जैसे आप उम्मीद करेंगे।


मैक के लिए एक्सेल 2011 पर भी काम करता है।
एडम

आपके पोस्ट के लिए धन्यवाद, यूएफएफ -16 एल का उपयोग तब भी ठीक है जब आपने कार्यालय 2007 एसपी 3 स्थापित नहीं किया था, लेकिन बीओएम 0xFF 0xFE
zhaozhi

4

जैसा कि फ्रीगल ने कहा कि \ uFEFF जाने का रास्ता है।

<%@LANGUAGE="JAVASCRIPT" CODEPAGE="65001"%>
<%
Response.Clear();
Response.ContentType = "text/csv";
Response.Charset = "utf-8";
Response.AddHeader("Content-Disposition", "attachment; filename=excelTest.csv");
Response.Write("\uFEFF");
// csv text here
%>

1
जब आप BOM का उपयोग करते हैं, तो केवल 2007 में अपने टैब सेपरेटर को अनदेखा करके देखें। आपको कुछ और लेकर आना होगा।
क्रिस्टियान वेस्टरबेक

3

मैंने यह भी देखा है कि कुछ समय पहले इस सवाल का "जवाब" दिया गया था, लेकिन मैं उन कहानियों को नहीं समझता, जो कहती हैं कि आप पाठ विज़ार्ड का उपयोग किए बिना Excel में सफलतापूर्वक एक utf8-encoded csv फ़ाइल नहीं खोल सकते।

मेरा प्रतिलिपि प्रस्तुत करने योग्य अनुभव: Old MacDonald had a farm,ÈÌÉÍØनोटपैड में टाइप करें, एंटर दबाएं, फिर सेव अस (UTF-8 विकल्प का उपयोग करके)।

वास्तव में वहाँ क्या है यह दिखाने के लिए अजगर का उपयोग करना:

>>> open('oldmac.csv', 'rb').read()
'\xef\xbb\xbfOld MacDonald had a farm,\xc3\x88\xc3\x8c\xc3\x89\xc3\x8d\xc3\x98\r\n'
>>> ^Z

अच्छा। नोटपैड ने सामने एक BOM लगाई है।

अब विंडोज एक्सप्लोरर में जाएं, फ़ाइल नाम पर डबल क्लिक करें, या राइट क्लिक करें और "ओपन विथ ..." का उपयोग करें, और अपेक्षित प्रदर्शन के साथ एक्सेल (2003) पॉप अप करें।


@Cocowalla: ठीक है, मैंने अभी यह कोशिश की (फिर; मैंने पोस्ट करने से पहले इसका परीक्षण किया था) और इसने एक्सेल 2007 के साथ काम किया (जो कि मैं अब उपयोग कर रहा हूं)। क्या आपने open('oldmac.csv', 'rb').read()अपने इनपुट को सत्यापित करने के लिए किया था ?
जॉन मैकिन

मैंने एक्सेल 2007 के साथ कोशिश नहीं की (मुझे पता है कि एक्सेल 2007 में यूटीएफ -8 फाइलें एक बीओएम के साथ ठीक हैं), मैंने एक्सेल 2003 के साथ कोशिश की
कोकोलोला

@Cocowalla: जब यह मेरे पास था, तब मैंने एक्सेल 2003 के साथ काम किया। क्या आप सुनिश्चित हैं कि आपके पास Excel 2003 के लिए नवीनतम सर्विस पैक है? जैसा कि मैंने सुझाव दिया था क्या आपने इनपुट का सत्यापन किया?
जॉन मैकिन

मैंने सत्यापित किया कि नोटपैड ने फ़ाइल की शुरुआत में एक बीओएम अटका दिया था, लेकिन मैं एक्सेल 2003 SP2 (एसपी 3 उपलब्ध है) पर हूं - इसलिए मुझे लगता है कि यह केवल एसपी 3 में काम करता है
कोकवल्ला

2

आप एक्सटेंशन 'xls' के साथ एक html फ़ाइल सहेज सकते हैं और उच्चारण काम करेंगे (2007 से पहले कम से कम)।

उदाहरण: इसे सहेजें (टेस्टपैड में Save as ut8 का उपयोग करके) test.xls के रूप में:

<html>
<meta http-equiv="Content-Type" content="text/html" charset="utf-8" />
<table>
<tr>
  <th>id</th>
  <th>name</th>
</tr>
<tr>
 <td>4</td>
 <td>Hélène</td>
</tr>
</table>
</html>

दिलचस्प विकल्प। यह पाठ को सही खोलता है लेकिन किसी कारण से सभी पृष्ठ पूरी तरह से सफेद हो जाता है। क्लासिक स्प्रेडशीट लाइनों के बिना पंक्तियों और स्तंभों का परिसीमन (मैक के लिए कार्यालय)
सेबस्टियन सस्त्रे

हाँ, विंडोज पर Office 2007 में एक ही बात। यह हमेशा मुझे आश्चर्यचकित करता है कि इसने ईमानदारी से काम किया। (ध्यान दें, यदि आप जोड़ने के border="1"मेज पर, आप कर लाइनों मिलता है, लेकिन सिर्फ लगभग 4 कोशिकाओं :)
Benjol

1

यह सिर्फ चरित्र परिचर्चा का सवाल है। ऐसा लगता है कि आप अपने डेटा को UTF-8 के रूप में निर्यात कर रहे हैं: UTF-8 में é दो-बाइट अनुक्रम 0xC3 0xA9 है, जिसे जब Windows-1252 में व्याख्या किया जाता है तो यह Ã © है। जब आप अपने डेटा को एक्सेल में आयात करते हैं, तो यह बताना सुनिश्चित करें कि आपके द्वारा उपयोग किया जाने वाला वर्ण एन्कोडिंग UTF-8 है।


मैंने पुष्टि की है कि डेटा UTF-8 है। एक्सल -8 (BOM?)
फेल्डो ४११

मुझे लगता है कि आपको फ़ाइल एन्कोडिंग बदलने की आवश्यकता है, एक्सेल सीएसवी फ़ाइलों को संभालने के लिए सिस्टम डिफ़ॉल्ट कोडपेज का उपयोग करता है
albertein

मुझे पूरी तरह से यकीन नहीं है, क्योंकि मेरे पास वर्तमान में उपयोग की जा रही मशीन पर एक्सेल स्थापित नहीं है, लेकिन ओपनऑफिस के साथ, जब आप एक सीएसवी फ़ाइल आयात करते हैं तो चरित्र एन्कोडिंग के लिए एक ड्रॉपडाउन बॉक्स होता है। वहां से, यूनिकोड (UTF-8) चुनें।
एडम रोसेनफील्ड

Excel में ड्रॉपडाउन AFAIK
albertein

1

एक्सेल में CSV प्रारूप ASCII के रूप में लागू किया गया है, न कि यूनिकोड के रूप में, इस प्रकार विकृतिविज्ञान का प्रबंधन। हमने उसी मुद्दे का अनुभव किया जो मैंने कैसे ट्रैक किया कि आधिकारिक सीएसवी मानक को एक्सेल में एएससीआईआई-आधारित के रूप में परिभाषित किया गया था।


दरअसल, CSV एक विशिष्ट एन्कोडिंग के लिए बाध्य नहीं है। यह Excel है जो ASCII मान रहा है। en.wikipedia.org/wiki/Comma-separated_values
spoulson

कि मैं क्या कहा। "एक्सेल में ASCII के रूप में लागू किया गया", "CSV को एक्सेल में ASCII- आधारित के रूप में परिभाषित किया गया"। सुनिश्चित नहीं हैं कि आप मेरे साथ सहमत होने के रूप में क्या बात कर रहे हैं।
जेफ येट्स

2
वास्तव में आप कहते हैं "सीएसवी प्रारूप एएससीआई के रूप में लागू किया गया है", मुझे लगता है कि जहां से भ्रम पैदा होता है।
रिचर्डॉड

1

एक्सेल 2007 ठीक से यूओएम -8 को बीओएम (ईएफ बीबी बीएफ) एनकोडेड एनकोड के साथ पढ़ता है।

Excel 2003 (और शायद पहले) BOM (FF FE) के साथ UTF-16LE पढ़ता है, लेकिन कॉमा या अर्धविराम के बजाय TAB के साथ।


1

मैं केवल एक्सेल 2007 में ठीक से पार्स करने के लिए सीएसवी प्राप्त कर सकता हूं क्योंकि उचित बायोडेटा ऑर्डर मार्क के साथ शुरू होने वाले छोटे-से-अलग यूटीएफ -16 को अलग कर दिया गया है।


1

आउटपुट CSV फ़ाइल में BOM लिखना वास्तव में मेरे लिए Django में काम करता है:

def handlePersoonListExport(request):
    # Retrieve a query_set
    ...

    template = loader.get_template("export.csv")
    context = Context({
        'data': query_set,
    })

    response = HttpResponse()
    response['Content-Disposition'] = 'attachment; filename=export.csv'
    response['Content-Type'] = 'text/csv; charset=utf-8'
    response.write("\xEF\xBB\xBF")
    response.write(template.render(context))

    return response

अधिक जानकारी के लिए http://crashcoursing.blogspot.com/2011/05/exporting-csv-with-special-characters.html धन्यवाद!


हाँ, इसने मेरे लिए Excel 2010 के साथ काम किया। जावा उपयोग में printWriter.print('\ufeff'), जावा में UTF-8 BOM जोड़ने का तरीका भी देखें ।
tsauerwein 10

1

एक और समाधान जो मुझे मिला वह था कि परिणाम को विंडोज कोड पेज 1252 (विंडोज -1252 या सीपी 1252) के रूप में सांकेतिक शब्दों में बदलना। यह उदाहरण के लिए, Content-Typeजैसे कि किसी चीज़ को उचित रूप से text/csv; charset=Windows-1252सेट करके और प्रतिक्रिया स्ट्रीम के कैरेक्टर एन्कोडिंग को इसी तरह सेट करके किया जाएगा।


इसके लिए धन्यवाद। एक्सेल विंडो और मैक पर काम करता है। मैं इसका उपयोग कर रहा हूँ।
सेबस्टियन सस्त्रे

यह केवल तभी काम करेगा जब आपकी गैर-अस्की चरित्र सीमा पूरी तरह से विंडोज -1252 के भीतर हो। उदाहरण के लिए, कोई कोरियाई / चीनी / जापानी, कोई सिरिलिक आदि नहीं है, लेकिन मुझे लगता है कि आप सबसे पश्चिमी यूरोपीय भाषाओं के लिए इसके साथ स्लाइड करेंगे।
टॉम मैकक्लर

1

ध्यान दें कि UTF-8 BOM सहित आवश्यक रूप से एक अच्छा विचार नहीं है - Excel के मैक संस्करण इसे अनदेखा करते हैं और वास्तव में BOM को ASCII के रूप में प्रदर्शित करेंगे ... आपकी स्प्रेडशीट में पहले फ़ील्ड की शुरुआत में तीन गंदे अक्षर ...


मुझे पता है कि यह टिप्पणी 6 साल बाद की है, लेकिन FWIW: '\uFEFF' + myCsvStringमैक एक्सेल 15.19.1 (2016) पर अपेक्षित रूप से काम करता है जैसी फ़ाइल डाउनलोड करने के लिए जावास्क्रिप्ट का उपयोग करना ।
बॉबजोन

0

एन्कोडिंग की जाँच करें जिसमें आप फ़ाइल उत्पन्न कर रहे हैं, फ़ाइल को सही ढंग से प्रदर्शित करने के लिए आपको सिस्टम डिफ़ॉल्ट कोडपेज का उपयोग करना होगा।

आप किस भाषा का उपयोग कर रहे हैं? यदि यह .Net है तो आपको केवल फ़ाइल बनाते समय Encoding.Default का उपयोग करना होगा।


निर्यात डेटा utf-8 है। मैं निर्यात फ़ाइल php 5 के साथ लिख रहा हूँ
फ्रेड्डो ४११

Windows-1252 कोडपेज पर डेटा ट्रांसकोड करें, मुझे यकीन नहीं है कि यह php के साथ कैसे
मिलाएं

0

यदि आपके पास मेरे जैसे vb.net में विरासत कोड है, तो निम्न कोड ने मेरे लिए काम किया:

    Response.Clear()
    Response.ClearHeaders()
    Response.ContentType = "text/csv"
    Response.Expires = 0
    Response.AddHeader("Content-Disposition", "attachment; filename=export.csv;")
    Using sw As StreamWriter = New StreamWriter(Context.Response.OutputStream, System.Text.Encoding.Unicode)
        sw.Write(csv)
        sw.Close()
    End Using
    Response.End()

0

मैंने समस्या को हल करने का एक तरीका ढूंढ लिया है। यह एक गंदा हैक है, लेकिन यह काम करता है: ओपन ऑफिस के साथ डॉक्टर को खोलें , फिर इसे किसी भी एक्सेल प्रारूप में सहेजें; परिणामी .xlsया .xlsxप्रदर्शित वर्ण प्रदर्शित करेगा।


1
ओपी का कहना है कि वह प्रोग्रामेटिक रूप से निर्यात कर रहा है, इसलिए वह ऐसे समाधान की तलाश नहीं कर रहा है जिसमें मैन्युअल हस्तक्षेप की आवश्यकता हो।
क्रिस्टियान वेस्टरबेक

0

रूबी 1.8.7 के साथ, मैं हर क्षेत्र को UTF-16 में संलग्न करता हूं और BOM (शायद) को छोड़ देता हूं।

निम्नलिखित कोड active_scaffold_export से निकाला जाता है:

<%                                                                                                                                                                                                                                                                                                                           
      require 'fastercsv'                                                                                                                                                                                                                                                                                                        
      fcsv_options = {                                                                                                                                                                                                                                                                                                           
        :row_sep => "\n",                                                                                                                                                                                                                                                                                                        
        :col_sep => params[:delimiter],                                                                                                                                                                                                                                                                                          
        :force_quotes => @export_config.force_quotes,                                                                                                                                                                                                                                                                            
        :headers => @export_columns.collect { |column| format_export_column_header_name(column) }                                                                                                                                                                                                                                
      }                                                                                                                                                                                                                                                                                                                          

      data = FasterCSV.generate(fcsv_options) do |csv|                                                                                                                                                                                                                                                                           
        csv << fcsv_options[:headers] unless params[:skip_header] == 'true'                                                                                                                                                                                                                                                      
        @records.each do |record|                                                                                                                                                                                                                                                                                                
          csv << @export_columns.collect { |column|                                                                                                                                                                                                                                                                              
            # Convert to UTF-16 discarding the BOM, required for Excel (> 2003 ?)                                                                                                                                                                                                                                     
            Iconv.conv('UTF-16', 'UTF-8', get_export_column_value(record, column))[2..-1]                                                                                                                                                                                                                                        
          }                                                                                                                                                                                                                                                                                                                      
        end                                                                                                                                                                                                                                                                                                                      
      end                                                                                                                                                                                                                                                                                                                        
    -%><%= data -%>

महत्वपूर्ण पंक्ति है:

Iconv.conv('UTF-16', 'UTF-8', get_export_column_value(record, column))[2..-1]

-2

एनकोड पर नोटपैड ++ क्लिक के साथ फाइल सीएसवी खोलें, यूटीएफ -8 में कनवर्ट करें का चयन करें (यूटीएफ -8 में कन्वर्ट नहीं) (बीओएम के बिना) एक्सेल के साथ डबल क्लिच द्वारा खोलें ओपन करें आशा है कि क्रिस्टोफ ग्रिसन की मदद करें


1
यह इस सवाल का जवाब नहीं देता है क्योंकि इसे प्रोग्रामेटिक रूप से किया जाना चाहिए और हर फाइल को मैन्युअल रूप से री-सेव करने के लिए यूजर के हस्तक्षेप की आवश्यकता नहीं है
जो डब्ल्यू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.