2014-10-28 3 views
5

में वाईफस्ट्रम का उपयोग करने में विफल रहता है। मैं std :: wifstream, और std :: getline का उपयोग कर Shift-JIS (cp 932) में एन्कोड की गई एक टेक्स्ट फ़ाइल को पढ़ने का प्रयास कर रहा हूं। निम्नलिखित कोड VS2010 में काम करता है, लेकिन VS2013 में विफल रहता है:शिफ्ट-जेआईएस डिकोडिंग विजुअल सी ++ 2013

std::wifstream in; 
in.open("data932.txt"); 

const std::locale locale(".932"); 

in.imbue(locale); 

std::wstring line1, line2; 
std::getline(in, line1); 
std::getline(in, line2); 
const bool good = in.good(); 

फ़ाइल कई लाइनों है, जिसकी पहली लाइन बस ASCII वर्ण हैं शामिल है, और दूसरी जापानी स्क्रिप्ट है। इस प्रकार, जब यह स्निपेट चलता है, line1 में ASCII लाइन, line2 जापानी स्क्रिप्ट होना चाहिए, और good सत्य होना चाहिए।

वीएस -2010 में संकलित होने पर, परिणाम अपेक्षित है। लेकिन जब VS2013 में संकलित किया गया, line1 में ASCII लाइन है, लेकिन line2 खाली है, और good गलत है।

मैंने सीआरटी में डीबग किया, (जैसा कि स्रोत विजुअल स्टूडियो के साथ प्रदान किया गया है), और पाया कि एक आंतरिक फ़ंक्शन _Mbrtowc (फ़ाइल xmbtowc.c में) को दो संस्करणों के बीच संशोधित किया गया था, और जिस तरह से वे पहचानने के लिए उपयोग करते थे एक डबल बाइट चरित्र का एक लीड बाइट बदल दिया गया था, और वीएस 2013 में से एक एक लीड बाइट का पता लगाने में विफल रहता है, इस प्रकार बाइट स्ट्रीम को डीकोड करने में विफल रहता है।

इसके अलावा डिबगिंग एक बिंदु है, जहां एक _Cvtvec वस्तु की _Isleadbyte सरणी आरंभ नहीं हो जाता (समारोह _Getcvt() में, फ़ाइल xwctomb.c में) से पता चला है, और कहा कि प्रारंभ में एक गलत परिणाम पैदा करता है। ऐसा लगता है कि यह हमेशा कोड पेज 1252 का उपयोग करता है, जो कि मेरे सिस्टम पर डिफ़ॉल्ट कोड पेज है, न कि 932 जो उपयोग में स्ट्रीम के लिए सेट है। हालांकि, मैं यह तय नहीं कर सका कि यह डिज़ाइन द्वारा है, और मुझे अच्छा परिणाम प्राप्त करने के लिए कुछ आवश्यक कदम याद किए गए हैं, या यह वास्तव में वीएस2013 के लिए सीआरटी में एक बग है।

दुर्भाग्य से मेरे पास VS2012 इंस्टॉल नहीं है, इसलिए मैं उस संस्करण पर परीक्षण नहीं कर सका।

इस विषय पर कोई अंतर्दृष्टि स्वागत है!

+0

पोस्ट इस –

+0

connect.microsoft.com को मैं 'रंगना करने की कोशिश कर()' नए स्थान से शुरू होगा पहले फ़ाइल को खोलने के लिए: मुझे लगता है धारा खुला दौरान पात्रों पढ़ सकते हैं और एक बार वर्णों को पढ़ने जाते हैं यह प्रयुक्त 'std :: codecvt <...>' पहलू को नहीं बदलेगा। –

+0

@ डाइटमार कुहल मैंने अभी इसे चेक किया है, लेकिन परिणाम समान थे: वीएस -2010 में काम करता है, लेकिन वीएस2013 में उसी तरह विफल रहता है। –

उत्तर

2

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

const int oldMbcp = _getmbcp(); 
_setmbcp(932); 
const std::locale locale("Japanese_Japan.932"); 
_setmbcp(oldMbcp); 
+0

लेकिन इस के रूप में लगता है कि यह सिर्फ एक कामकाज है, मैं इसे उत्तर के रूप में स्वीकार नहीं करूंगा ... –

+0

मैं [हिट] रहा हूं (http://stackoverflow.com/questions/33254089/double-byte-character-sequence-conversion-issue इन-विज़ुअल-स्टूडियो-2015) इसके साथ-साथ। मैंने इस मुद्दे के लिए एक [बग रिपोर्ट] (https://connect.microsoft.com/VisualStudio/feedback/details/1925650) भर दी है। – wilx

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