2010-03-23 15 views
7

हमारी टीम में हम दृश्य स्टूडियो 2008 टीम फाउंडेशन सर्वर स्रोत नियंत्रण में है, जिसमें एक डेटाबेस परियोजना की वजह से लोड नहीं करता है। प्रत्येक दो हफ्ते या तो, एक सहकर्मी की जांच के बाद, प्रोजेक्ट फ़ाइल अन्य डेवलपर्स मशीनों पर लोड नहीं होगी। त्रुटि संदेश है:विजुअल स्टूडियो 2008 प्रोजेक्ट फाइल एक अप्रत्याशित एन्कोडिंग परिवर्तन

प्रोजेक्ट फ़ाइल लोड नहीं की जा सकी। रूट स्तर पर डेटा अमान्य है। लाइन 1, स्थिति 1.

जब मैं नोटपैड में प्रोजेक्ट फाइल ++ को देखो, फ़ाइल इस तरह दिखता है:

��<NUL?NULxNULmNULlNUL NULvNULeNULrNULsNULiNULoNULnNUL ...

और इतने पर (आप इस में <?xml version देख सकते हैं) जबकि एक सामान्य परियोजना फ़ाइल लगता है:

<?xml version="1.0" encoding="utf-16"?> ...

तो शायद कुछ ENC साथ कुछ गड़बड़ है फ़ाइल की oding। यह हमारे लिए एक समस्या है क्योंकि फाइल एन्कोडिंग को फिर से सही करना असंभव हो जाता है। 'समाधान' प्रोजेक्ट फ़ाइल को फेंकना है ताकि स्रोत नियंत्रण से अंतिम ज्ञान वाले संस्करण को प्राप्त किया जा सके।

फ़ाइल के अनुसार, एन्कोडिंग UTF-16 होना चाहिए। नोटपैड ++ के अनुसार, दूषित फ़ाइल वास्तव में यूटीएफ -8 है।

मेरे प्रश्न हैं:

  • क्यों दृश्य स्टूडियो ऊपर एन्कोडिंग प्रोजेक्ट फाइल की, खिलवाड़ है जाहिरा तौर पर यादृच्छिक समय पर और यादृच्छिक मशीनों पर?
  • हम इसे रोकने के लिए क्या करना चाहिए?
  • जब यह हुआ है, वहाँ सही एन्कोडिंग बजाय स्रोत नियंत्रण से एक पुराने संस्करण खींच की में वर्तमान फ़ाइल को पुनर्स्थापित करने के लिए एक संभावना है?

अंतिम नोट के रूप में: समस्या एक एकल प्रोजेक्ट फ़ाइल के साथ है, अन्य सभी प्रोजेक्ट फाइलें इस समस्या का पर्दाफाश नहीं करती हैं।

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

यह अभी भी सवाल छोड़ क्यों दृश्य स्टूडियो फ़ाइल भ्रष्ट।

+0

यदि आप टूटी हुई और काम करने वाली फ़ाइलों के बीच बाइनरी diff करते हैं तो आप क्या देखते हैं? मुझे आश्चर्य है कि यह एक यूटीएफ -16 एंडियननेस मुद्दा है। –

+0

यदि मैं बाइनरी diff करता हूं तो यह पता चला है कि फाइल इंडेंटिकल हैं सिवाय इसके कि सही शुरुआत में दो अतिरिक्त बाइट्स हैं, एफएफ एफई, और भ्रष्ट व्यक्ति के पास 9 अतिरिक्त बाइट ईएफ बीबी बीएफ ईएफ बीएफ बीडी ईएफ बीएफ बीडी था। – Xenan

उत्तर

4

मुझे लगता है कि मैं में कुछ अंतर्दृष्टि प्रदान कर सकता हूं क्या हो रहा है, यदि नहीं।

FF FEBOM है; फ़ाइल की शुरुआत में इसकी उपस्थिति इंगित करती है कि फ़ाइल का एन्कोडिंग यूटीएफ -16 है, थोड़ा-एंडियन। और यह मूल फ़ाइल की तरह लगता है वास्तव में UTF-16 है, लेकिन कुछ बीओएम अनदेखी और इसे पढ़ने के रूप में अगर यह UTF-8 थे।

जब ऐसा होता है, तो प्रत्येक बाइट FF और FE को अमान्य माना जाता है और आधिकारिक यूनिकोड कचरा चरित्र U+FFFD में परिवर्तित किया जाता है।फिर, जब पाठ को फिर से फ़ाइल में लिखा जाता है, तो प्रत्येक कचरा पात्रों को इसके यूटीएफ -8 एन्कोडिंग (EF BF BD) में परिवर्तित कर दिया जाता है और यूटीएफ -8 बीओएम (EF BB BF) उनके सामने जोड़ा जाता है, जिसके परिणामस्वरूप नौ बाइट अनुक्रम आप सूचना:

EF BB BF # UTF-8 BOM 
EF BF BD # U+FFFD in UTF-8 
EF BF BD # ditto 

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

क्या प्रोजेक्ट फ़ाइलों को वास्तव में यूटीएफ -16 होना चाहिए? यदि नहीं, तो शायद एक डेवलपर सिस्टम यूटीएफ -16 उत्पन्न कर रहा है जब संस्करण-नियंत्रण प्रणाली यूटीएफ -8 की अपेक्षा कर रही है। मैंने अपने विजुअल सी # एक्सप्रेस इंस्टॉलेशन में नोटिस किया है कि Environment->Documents के तहत एक विकल्प है जिसे "कोड को कोडपेज में सहेजा नहीं जा सकता है जब यूनिकोड के रूप में दस्तावेज़ सहेजें"। ऐसा कुछ ऐसा लगता है जो एन्कोडिंग को स्पष्ट रूप से यादृच्छिक समय में बदल सकता है।

+0

धन्यवाद, यह वास्तव में कुछ अंतर्दृष्टि देता है। – Xenan

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