2008-12-02 6 views
28

नीचे दी गई मेरी पोस्ट ने पूछा कि घुंघराले उद्धरण चिह्न क्या थे और मेरा ऐप उनके साथ क्यों काम नहीं करेगा, मेरा सवाल यह है कि जब मैं अपना प्रोग्राम उनके पास आता हूं तो मैं उन्हें कैसे बदल सकता हूं, मैं इसे सी # में कैसे कर सकता हूं? क्या वे विशेष पात्र हैं?सी # सीधे उद्धरण चिह्नों के साथ माइक्रोसॉफ्ट के स्मार्ट कोट्स को कैसे बदलें?

curly-quotation-marks-vs-square-quotation-marks-what-gives

धन्यवाद

+2

टाइपोग्राफर का उद्धरण चिह्न सीधे उद्धरण चिह्नों से कम वास्तविक नहीं है। –

उत्तर

3

वर्ण मानचित्र अनुप्रयोग है कि विंडोज के साथ आता के अनुसार, घुमावदार कोट्स के लिए यूनिकोड मान 0x201c और 0x201d हैं। उन मानों को सीधे उद्धरण 0x0022 के साथ बदलें, और आपको जाने के लिए अच्छा होना चाहिए।

String.Replace(0x201c, '"'); 
String.Replace(0x201d, '"'); 
5

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

मुझे नहीं लगता कि आपके द्वारा वर्णित तरीके से दूषित फ़ाइल को ठीक करने के लिए एक एल्गोरिदमिक तरीका है। आपका समय यह जांचने में बेहतर हो सकता है कि आप पहली बार ऐसी अमान्य फाइलें कैसे प्राप्त करते हैं, और फिर इसे रोक दें। उदाहरण के लिए, क्या कोई आपकी डेटा फ़ाइलों को संपादित करने के लिए वर्ड का उपयोग कर रहा है?

+0

एआरएम, मुझे नहीं लगता कि इस प्रश्न में सीएसवी फाइलों के साथ कुछ भी करना है ... :) –

+0

नहीं, लेकिन ओपी संदर्भित प्रश्न करता है। – GalacticCowboy

23

जब मुझे इस समस्या का सामना करना पड़ा तो मैंने सी # में स्ट्रिंग क्लास में एक विस्तार विधि लिखा।

public static class StringExtensions 
{ 
    public static string StripIncompatableQuotes(this string s) 
    { 
     if (!string.IsNullOrEmpty(s)) 
      return s.Replace('\u2018', '\'').Replace('\u2019', '\'').Replace('\u201c', '\"').Replace('\u201d', '\"'); 
     else 
      return s; 
    } 
} 

यह सामान्य उद्धरणों के साथ मूर्खतापूर्ण 'स्मार्ट कोट्स' को प्रतिस्थापित करता है।

[संपादित करें] 'डबल स्मार्ट कोट्स' के प्रतिस्थापन का भी समर्थन करने के लिए फिक्स्ड।

+1

आपका कोड सिंगल कोट्स के साथ काम करता है, आपको डबल कोट्स के लिए \ u201c और \ u201d उपयोग करने की आवश्यकता है। –

+0

फिक्स्ड। धन्यवाद दोस्त। –

3

मेरे पास एक बहुत अच्छा बड़ा ... प्रोग्राम है ... यह ठीक है। आप स्क्रिप्ट को चीर सकते हैं और अपने लीजर पर इसका इस्तेमाल कर सकते हैं। यह प्रतिस्थापन के सभी प्रकार करता है, और http://bitbucket.org/nesteruk/typografix

1

पर स्थित है स्मार्ट एकल उद्धरण के लिए यह प्रयास से ऊपर है, तो काम नहीं करते:

:

string.Replace("\342\200\230", "'") 
string.Replace("\342\200\231", "'") 

इस स्मार्ट दोहरे उद्धरण चिह्नों के लिए भी प्रयास करें समस्याग्रस्त शब्द पात्रों में से

string.Replace("\342\200\234", '"') 
string.Replace("\342\200\235", '"') 
40

एक अधिक व्यापक सूची

if (buffer.IndexOf('\u2013') > -1) buffer = buffer.Replace('\u2013', '-'); 
if (buffer.IndexOf('\u2014') > -1) buffer = buffer.Replace('\u2014', '-'); 
if (buffer.IndexOf('\u2015') > -1) buffer = buffer.Replace('\u2015', '-'); 
if (buffer.IndexOf('\u2017') > -1) buffer = buffer.Replace('\u2017', '_'); 
if (buffer.IndexOf('\u2018') > -1) buffer = buffer.Replace('\u2018', '\''); 
if (buffer.IndexOf('\u2019') > -1) buffer = buffer.Replace('\u2019', '\''); 
if (buffer.IndexOf('\u201a') > -1) buffer = buffer.Replace('\u201a', ','); 
if (buffer.IndexOf('\u201b') > -1) buffer = buffer.Replace('\u201b', '\''); 
if (buffer.IndexOf('\u201c') > -1) buffer = buffer.Replace('\u201c', '\"'); 
if (buffer.IndexOf('\u201d') > -1) buffer = buffer.Replace('\u201d', '\"'); 
if (buffer.IndexOf('\u201e') > -1) buffer = buffer.Replace('\u201e', '\"'); 
if (buffer.IndexOf('\u2026') > -1) buffer = buffer.Replace("\u2026", "..."); 
if (buffer.IndexOf('\u2032') > -1) buffer = buffer.Replace('\u2032', '\''); 
if (buffer.IndexOf('\u2033') > -1) buffer = buffer.Replace('\u2033', '\"'); 
+3

मैं उत्सुक हूं, क्या किसी ने प्रदर्शन परीक्षण किया है जो दिखाता है IndexOf() चलने से सस्ता है। एक स्ट्रिंग पर बदलें() जिसमें चरित्र नहीं है? –

+0

सबसे सस्ता ऑपरेशन स्ट्रिंग को एक बार फिर से चालू करना होगा, संभवतया 2 * वर्णों की संख्या को संबोधित करना। उदाहरण: 'foreach (बफर में चार सी) {/ * यदि सूची में चार बदल दिया जाना है, * /} 'बदलें। – Dan

1

मेरे पास एक प्रोग्राम भी है जो यह करता है, स्रोत CP-1252 Fixer में है। यह अतिरिक्त रूप से आरटीएफ तारों के भीतर वर्णों को परिवर्तित करने के लिए कुछ मैपिंग को परिभाषित करता है, जबकि सभी स्वरूपण को संरक्षित करता है, जो कुछ के लिए उपयोगी हो सकता है।

यह सभी "स्मार्ट कोट" वर्णों को उनके निम्न-एसीआई समकक्षों, इकाई कोड और चरित्र संदर्भों के लिए एक पूर्ण मैपिंग भी है।

3

वीबी @Matthew क्या लिखा है के बराबर:

Public Module StringExtensions 

    <Extension()> 
    Public Function StripIncompatableQuotes(BadString As String) As String 
     If Not String.IsNullOrEmpty(BadString) Then 
      Return BadString.Replace(ChrW(&H2018), "'").Replace(ChrW(&H2019), "'").Replace(ChrW(&H201C), """").Replace(ChrW(&H201D), """") 
     Else 
      Return BadString 
     End If 
    End Function 
End Module 
4

निक वैन Esch के लोकप्रिय जवाब पर विस्तार करने के लिए, यहाँ टिप्पणी में पात्रों के नाम के साथ कोड है।

if (buffer.IndexOf('\u2013') > -1) buffer = buffer.Replace('\u2013', '-'); // en dash 
if (buffer.IndexOf('\u2014') > -1) buffer = buffer.Replace('\u2014', '-'); // em dash 
if (buffer.IndexOf('\u2015') > -1) buffer = buffer.Replace('\u2015', '-'); // horizontal bar 
if (buffer.IndexOf('\u2017') > -1) buffer = buffer.Replace('\u2017', '_'); // double low line 
if (buffer.IndexOf('\u2018') > -1) buffer = buffer.Replace('\u2018', '\''); // left single quotation mark 
if (buffer.IndexOf('\u2019') > -1) buffer = buffer.Replace('\u2019', '\''); // right single quotation mark 
if (buffer.IndexOf('\u201a') > -1) buffer = buffer.Replace('\u201a', ','); // single low-9 quotation mark 
if (buffer.IndexOf('\u201b') > -1) buffer = buffer.Replace('\u201b', '\''); // single high-reversed-9 quotation mark 
if (buffer.IndexOf('\u201c') > -1) buffer = buffer.Replace('\u201c', '\"'); // left double quotation mark 
if (buffer.IndexOf('\u201d') > -1) buffer = buffer.Replace('\u201d', '\"'); // right double quotation mark 
if (buffer.IndexOf('\u201e') > -1) buffer = buffer.Replace('\u201e', '\"'); // double low-9 quotation mark 
if (buffer.IndexOf('\u2026') > -1) buffer = buffer.Replace("\u2026", "..."); // horizontal ellipsis 
if (buffer.IndexOf('\u2032') > -1) buffer = buffer.Replace('\u2032', '\''); // prime 
if (buffer.IndexOf('\u2033') > -1) buffer = buffer.Replace('\u2033', '\"'); // double prime 
+3

हाय बारबरा। उत्तर के लिए उपयोगी जोड़, लेकिन यह एक नए के बजाय मौजूदा उत्तर में सुझाए गए संपादन के रूप में बेहतर होगा। – Stijn

+0

@ बरबारा, हाय, क्या कोई ऐसी विधि नहीं है जो सभी पात्रों को मैन्युअल रूप से निर्दिष्ट किए बिना सभी वर्णों को प्रतिस्थापित कर सके। यदि भविष्य में, कोड में ऊपर निर्दिष्ट से अलग एक और वर्ण हैं, तो? –

+0

यह हमारे मामले में वर्तमान आवश्यकता है। एमएस वर्ड फ़ाइल से कोई विशेष चरित्र आ सकता है और इसे सीधे चरित्र में परिवर्तित किया जाना चाहिए और ठीक से दिखाया जाना चाहिए। –

0

यह मेरे लिए काम किया है, तो आप कोड

string replacedstring = ("your string with smart quotes").Replace('\u201d', '\''); 

धन्यवाद नीचे की कोशिश कर सकते हैं!

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