2013-04-08 8 views
8

समारोह towlower() विजुअल स्टूडियो 2012 यहाँ में काम करने के लिए प्रतीत नहीं होता है एक उदाहरण है:टॉव्लॉवर() फ़ंक्शन Я को निम्न-केस я में क्यों परिवर्तित नहीं करता है?

#include <string> 
#include <iostream> 
#include <io.h> 
#include <fcntl.h> 
#include <wctype.h> 

using namespace std; 

int main() 
{ 
    _setmode(_fileno(stdout), _O_U8TEXT); 
    wcout << (wchar_t)towlower(L'Я') << endl; 
    system("pause"); 
    return 0; 
} 

चरित्र अपर केस बनी हुई है। पहले भी इसी तरह के प्रश्न पूछे गए हैं लेकिन मुझे कोई समाधान नहीं मिल रहा है।

क्या कोई और तरीका है जिसका उपयोग मैं कम मामले में बदलने के लिए कर सकता हूं?

+0

[हम सभी टाइपो प्रश्न बंद करते हैं,] (http://meta.stackexchange.com/questions/167342/close-all-the-typo-questions) वैसे भी। –

+0

@ एच 2CO3: अब आपने मुझे भी धोखा दिया :(। ['Towlower'] देखें (http://en.cppreference.com/w/cpp/string/wide/towlower) – Zeta

+3

आपका क्या मतलब है? कोई टाइपो नहीं है। –

उत्तर

6

tolower के लोकेल-जागरूक संस्करण का उपयोग करें, लेकिन सी लोकेल भी सेट करना न भूलें।

उदाहरण के लिए:

#include <clocale> 
#include <locale> 
#include <iostream> 

int main() 
{ 
    std::setlocale(LC_CTYPE, ""); 
    std::wcout << L"The letter is: " << L'Я' << L" => " 
       << std::tolower(L'Я', std::locale("")) << std::endl; 
} 

यह प्रिंट:

The letter is: Я => я 

iostreams में स्थानों का उपयोग करना मुश्किल काम है, और वहाँ एक पूरी भानुमती का पिटारा इस के पीछे छिपा हुआ है। उदाहरण के लिए, आप इम्बु लोकेल के साथ स्ट्रीम कर सकते हैं, और आप एक साथ कई स्थानीय स्थान प्रबंधित कर सकते हैं, और विशेष रूप से आपके पास एक प्रति थ्रेड हो सकता है (जो राज्यव्यापी स्ट्रिंग एन्कोडिंग रूपांतरणों के लिए आवश्यक हो सकता है) ... किसी को एक पुस्तक लिखनी चाहिए इसके बारे में (या इसके बजाय Boost.Locale का उपयोग करें)।

0

क्या यह टॉविगर से कम नुकसान करता है? j/k। मैं उलटा आर से परिचित नहीं हूं, लेकिन मुझे पता है कि अगर चरित्र के पास कम मामला समतुल्य नहीं है, तो (डब्ल्यू) निम्न मूल चरित्र को वापस कर देगा। http://en.cppreference.com/w/c/string/wide/towlower

+1

'Я' में लोअरकेस है -' я' –

5

मुझे दो संभावनाएं दिखाई देती हैं। पहला स्थान लोकेल सही ढंग से सेट नहीं किया जा रहा है। MSDN से:

towlower का केस रूपांतरण लोकेल-विशिष्ट है। वर्तमान में लोकेल के लिए प्रासंगिक वर्ण केवल मामले में बदल दिए गए हैं। _l प्रत्यय के बिना फ़ंक्शन वर्तमान में सेट लोकेल का उपयोग करते हैं।

दूसरा स्रोत स्रोत एन्कोडिंग है। L'Я' का मतलब आपकी स्रोत फ़ाइल को एन्कोड किए जाने के आधार पर अलग-अलग चीजों का हो सकता है। यह काम नहीं करेगा, उदाहरण के लिए, यदि आपके पास UTF-8 में है। सुनिश्चित करें कि आपके पास UTF-16 है। या किसी भी संभावित भ्रम को दूर करने के इस तरह '\u042F'

अद्यतन रख दिया: दूसरे सोचा इस पूरे L व्यापार मुश्किल है पर। यदि संकलक बीओएम के माध्यम से सही ढंग से एन्कोडिंग को समझता है, तो यह UTF-8 या किसी अन्य एन्कोडिंग के साथ ठीक हो सकता है। महत्वपूर्ण है कि यह पता होना चाहिए कि एन्कोडिंग क्या है। यह बहुत अधिक कार्यान्वयन विशिष्ट होना चाहिए।

एक और अद्यतन:

_wsetlocale(LC_ALL, L"ru-RU"); 

या संस्करण पैरामीटर (_towlower_l) के रूप में स्थान लेता है का उपयोग करें: समस्या को ठीक करने के माध्यम से वातावरण स्थापित करने के लिए प्रयास करें।

और pragma सब कुछ के शीर्ष पर भी है जो संकलक को फ़ाइल में गैर-ASCII स्ट्रिंग अक्षरों का इलाज करने का तरीका बताता है।

+1

डिफ़ॉल्ट रूप से, मेरा मानना ​​है कि वीसी ++ स्रोत फ़ाइलों को विंडोज -1252 एन्कोडेड (उर्फ लगभग-लेकिन-नहीं-काफी लैटिन 1) के रूप में मानता है, जिसका अर्थ है 'Я' जैसे फैंसी पात्रों को उलझने की संभावना है। तो हाँ, निश्चित रूप से '\ u042f' का उपयोग करें। :) – jalf

+1

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

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