C # में ToUpper () और ToUpperInvariant () में क्या अंतर है?


133

सी # में, के बीच अंतर क्या है ToUpper()और ToUpperInvariant()?

क्या आप एक उदाहरण दे सकते हैं जहां परिणाम भिन्न हो सकते हैं?


3
[संगठन] क्या इस सवाल का टैग "अंतर्राष्ट्रीयकरण" होना चाहिए?
जस्सो

जवाबों:


154

ToUpperवर्तमान संस्कृति का उपयोग करता है। ToUpperInvariantअपरिवर्तनीय संस्कृति का उपयोग करता है।

विहित उदाहरण तुर्की है, जहां "i" का ऊपरी मामला "I" नहीं है।

नमूना कोड अंतर दिखा रहा है:

using System;
using System.Drawing;
using System.Globalization;
using System.Threading;
using System.Windows.Forms;

public class Test
{
    [STAThread]
    static void Main()
    {
        string invariant = "iii".ToUpperInvariant();
        CultureInfo turkey = new CultureInfo("tr-TR");
        Thread.CurrentThread.CurrentCulture = turkey;
        string cultured = "iii".ToUpper();

        Font bigFont = new Font("Arial", 40);
        Form f = new Form {
            Controls = {
                new Label { Text = invariant, Location = new Point(20, 20),
                            Font = bigFont, AutoSize = true},
                new Label { Text = cultured, Location = new Point(20, 100),
                            Font = bigFont, AutoSize = true }
            }
        };        
        Application.Run(f);
    }
}

तुर्की के बारे में अधिक जानने के लिए, इस तुर्की टेस्ट ब्लॉग पोस्ट को देखें

मुझे यह सुनकर हैरानी नहीं होगी कि अभिलिखित चरित्रों के इर्द-गिर्द कई अन्य बड़े पूंजीकरण के मुद्दे हैं। यह सिर्फ एक उदाहरण है जिसे मैं अपने सिर के ऊपर से जानता हूं ... आंशिक रूप से क्योंकि यह मुझे सालों पहले जावा, जहां मैं ऊपरी था एक स्ट्रिंग को भरना और उसकी तुलना "मेल" से करना। तुर्की में इतना अच्छा काम नहीं किया ...


45
हाहा मैंने उस सोच को पढ़ा ... "'तुर्की' में एक अक्षर 'i' नहीं है"
Jeff Mercado

यह लगभग 2019 है और मैं विज़ुअल स्टूडियो को दिनांक और समय के लिए तुर्की क्षेत्रीय सेटिंग्स के साथ "अंग्रेजी" विंडोज पर कंसोल के लिए आंतरिक त्रुटि स्पैमिंग के ımageलिए एक फ़ील्ड नाम के रूप में सुझाव दे रहा हूं । ऐसा लगता है कि कभी-कभी Microsoft भी तुर्की परीक्षा में असफल हो जाता है, एक पीसी की भाषा भी तुर्की नहीं है, बस योग्य है। ImageUnable to find key name that matches 'rıght'
गनी ओज़ानस

28

जॉन का जवाब एकदम सही है। मैं बस जोड़ना चाहता था जो ToUpperInvariantकॉलिंग के समान है ToUpper(CultureInfo.InvariantCulture)

यह जॉन के उदाहरण को थोड़ा सरल बनाता है:

using System;
using System.Drawing;
using System.Globalization;
using System.Threading;
using System.Windows.Forms;

public class Test
{
    [STAThread]
    static void Main()
    {
        string invariant = "iii".ToUpper(CultureInfo.InvariantCulture);
        string cultured = "iii".ToUpper(new CultureInfo("tr-TR"));

        Application.Run(new Form {
            Font = new Font("Times New Roman", 40),
            Controls = { 
                new Label { Text = invariant, Location = new Point(20, 20), AutoSize = true }, 
                new Label { Text = cultured, Location = new Point(20, 100), AutoSize = true }, 
            }
        });
    }
}

मैंने न्यू टाइम्स रोमन का भी उपयोग किया क्योंकि यह एक कूलर फ़ॉन्ट है।

मैं भी सेट Formके Fontदो के बजाय संपत्ति Labelक्योंकि नियंत्रण Fontसंपत्ति विरासत में मिला है।

और मैंने कुछ अन्य पंक्तियों को सिर्फ इसलिए कम कर दिया क्योंकि मुझे कॉम्पैक्ट (उदाहरण, उत्पादन नहीं) कोड पसंद है।

मेरे पास इस समय करने के लिए कुछ भी बेहतर नहीं था।


5
"जॉन का जवाब एकदम सही है।" निरर्थक कथन की बात करें। ;)
क्रिलगर

1
टॉपर विधि में मेरे लिए कोई पैरामीटर अधिभार नहीं है? क्या पुराना संस्करण था? मुझे यह
समझ में

मैं नहीं जानता, यह यहाँ प्रलेखित है: msdn.microsoft.com/en-us/library/system.string.toupper.aspx
Tergiver


12

String.ToUpperऔर String.ToLowerअलग-अलग संस्कृतियों को देखते हुए अलग-अलग परिणाम दे सकते हैं। सबसे ज्ञात उदाहरण तुर्की उदाहरण है , जिसके लिए लोअरकेस लैटिन "i" को अपरकेस में बदलना, एक पूंजीगत लैटिन "I" में परिणाम नहीं करता है, लेकिन तुर्की "I" में।

संस्कृति के आधार पर I का कैपिटलाइज़ेशन, ऊपरी पंक्ति - निचले मामले पत्र, निचली पंक्ति - ऊपरी मामले पत्र

जैसा कि मेरे लिए यह उपरोक्त चित्र ( स्रोत ) के साथ भी भ्रामक था , मैंने तुर्की उदाहरण के लिए सटीक आउटपुट देखने के लिए एक कार्यक्रम (नीचे स्रोत कोड देखें) लिखा था:

# Lowercase letters
Character              | UpperInvariant | UpperTurkish | LowerInvariant | LowerTurkish
English i - i (\u0069) | I (\u0049)     | I (\u0130)   | i (\u0069)     | i (\u0069)
Turkish i - ı (\u0131) | ı (\u0131)     | I (\u0049)   | ı (\u0131)     | ı (\u0131)

# Uppercase letters
Character              | UpperInvariant | UpperTurkish | LowerInvariant | LowerTurkish
English i - I (\u0049) | I (\u0049)     | I (\u0049)   | i (\u0069)     | ı (\u0131)
Turkish i - I (\u0130) | I (\u0130)     | I (\u0130)   | I (\u0130)     | i (\u0069)

जैसा कि आप देख सकते हैं:

  1. निचले मामले के पत्रों को बड़ा करना और ऊपरी मामलों के अक्षरों को निचोड़ने से अपरिवर्तनीय संस्कृति और तुर्की संस्कृति के लिए अलग-अलग परिणाम मिलते हैं।
  2. ऊपरी मामले के पत्रों को ऊपर उठाना और निचले मामलों के पत्रों को कम करने से कोई प्रभाव नहीं पड़ता है, चाहे संस्कृति कोई भी हो।
  3. Culture.CultureInvariant के रूप में तुर्की अक्षर छोड़ देता है
  4. ToUpperऔर ToLowerप्रतिवर्ती होते हैं, जो कि एक वर्ण को अपरकेस करने के बाद उतारा जाता है, उसे मूल रूप में लाता है, जब तक कि दोनों ऑपरेशनों के लिए एक ही संस्कृति का उपयोग नहीं किया जाता।

MSDN के अनुसार , Char.ToUpper और Char.ToLower तुर्की और Azeri के लिए केवल प्रभावित संस्कृतियाँ हैं क्योंकि वे एकल-वर्ण आवरण अंतर वाले एकमात्र हैं। स्ट्रिंग्स के लिए, अधिक संस्कृतियां प्रभावित हो सकती हैं।


आउटपुट उत्पन्न करने के लिए उपयोग किए जाने वाले कंसोल एप्लिकेशन का स्रोत कोड:

using System;
using System.Globalization;
using System.Linq;
using System.Text;

namespace TurkishI
{
    class Program
    {
        static void Main(string[] args)
        {
            var englishI = new UnicodeCharacter('\u0069', "English i");
            var turkishI = new UnicodeCharacter('\u0131', "Turkish i");

            Console.WriteLine("# Lowercase letters");
            Console.WriteLine("Character              | UpperInvariant | UpperTurkish | LowerInvariant | LowerTurkish");
            WriteUpperToConsole(englishI);
            WriteLowerToConsole(turkishI);

            Console.WriteLine("\n# Uppercase letters");
            var uppercaseEnglishI = new UnicodeCharacter('\u0049', "English i");
            var uppercaseTurkishI = new UnicodeCharacter('\u0130', "Turkish i");
            Console.WriteLine("Character              | UpperInvariant | UpperTurkish | LowerInvariant | LowerTurkish");
            WriteLowerToConsole(uppercaseEnglishI);
            WriteLowerToConsole(uppercaseTurkishI);

            Console.ReadKey();
        }

        static void WriteUpperToConsole(UnicodeCharacter character)
        {
            Console.WriteLine("{0,-9} - {1,10} | {2,-14} | {3,-12} | {4,-14} | {5,-12}",
                character.Description,
                character,
                character.UpperInvariant,
                character.UpperTurkish,
                character.LowerInvariant,
                character.LowerTurkish
            );
        }

        static void WriteLowerToConsole(UnicodeCharacter character)
        {
            Console.WriteLine("{0,-9} - {1,10} | {2,-14} | {3,-12} | {4,-14} | {5,-12}",
                character.Description,
                character,
                character.UpperInvariant,
                character.UpperTurkish,
                character.LowerInvariant,
                character.LowerTurkish
            );
        }
    }


    class UnicodeCharacter
    {
        public static readonly CultureInfo TurkishCulture = new CultureInfo("tr-TR");

        public char Character { get; }

        public string Description { get; }

        public UnicodeCharacter(char character) : this(character, string.Empty) {  }

        public UnicodeCharacter(char character, string description)
        {
            if (description == null) {
                throw new ArgumentNullException(nameof(description));
            }

            Character = character;
            Description = description;
        }

        public string EscapeSequence => ToUnicodeEscapeSequence(Character);

        public UnicodeCharacter LowerInvariant => new UnicodeCharacter(Char.ToLowerInvariant(Character));

        public UnicodeCharacter UpperInvariant => new UnicodeCharacter(Char.ToUpperInvariant(Character));

        public UnicodeCharacter LowerTurkish => new UnicodeCharacter(Char.ToLower(Character, TurkishCulture));

        public UnicodeCharacter UpperTurkish => new UnicodeCharacter(Char.ToUpper(Character, TurkishCulture));


        private static string ToUnicodeEscapeSequence(char character)
        {
            var bytes = Encoding.Unicode.GetBytes(new[] {character});
            var prefix = bytes.Length == 4 ? @"\U" : @"\u";
            var hex = BitConverter.ToString(bytes.Reverse().ToArray()).Replace("-", string.Empty);
            return $"{prefix}{hex}";
        }

        public override string ToString()
        {
            return $"{Character} ({EscapeSequence})";
        }
    }
}

मामलों की तालिका बहुत मददगार थी। धन्यवाद!
वोट कॉफ़ी


2

अंग्रेजी में कोई अंतर नहीं है। केवल तुर्की संस्कृति में एक अंतर पाया जा सकता है।


13
और आपको यकीन है कि तुर्की दुनिया की एकमात्र संस्कृति है जिसमें अंग्रेजी की तुलना में ऊपरी मामले के लिए अलग नियम हैं? मेरे लिए इस पर भरोसा करना मुश्किल है।
जोएल मुलर

3
तुर्की सबसे अधिक इस्तेमाल किया जाने वाला उदाहरण है, लेकिन केवल एक ही नहीं। और यह भाषा है, संस्कृति नहीं है जिसमें चार अलग-अलग हैं I फिर भी, तुर्की के लिए +1।
आर्मस्ट्रांगेस्ट

यकीन है कि कुछ अन्य लोग भी होंगे। अधिकांश पीपीएल कभी भी प्रोग्रामिंग में उन भाषाओं को कभी नहीं मिलेंगे
स्टीफनवॉड्स

8
निश्चित ही वे करेंगे। वेब एप्लिकेशन ग्लोब के लिए खुले हैं और आपके पैरामीटर सेट करना अच्छा है। क्या होगा यदि आप एक विरासत डेटाबेस पर काम कर रहे हैं जो यूनिकोड नहीं करता है? एक उपयोगकर्ता नाम के रूप में आप कौन से वर्ण स्वीकार करेंगे? क्या होगा यदि आपको COBOL पर निर्मित लिगेसी ईआरपी में ग्राहक के नाम डालने हैं? बहुत सारे मामले जहां संस्कृति महत्वपूर्ण है। उल्लेख करने के लिए नहीं, दिनांक और संख्या। 4.54 को कुछ भाषाओं में 4,54 लिखा गया है। उन अन्य भाषाओं को रोकना मौजूद नहीं है जो आपको लंबे समय में बहुत दूर तक नहीं मिलेंगी।
आर्मस्ट्रांगेस्ट

स्पष्ट रूप से संस्कृतियां तिथियों और संख्याओं के लिए महत्वपूर्ण हैं, मैं सिर्फ यह कह रहा हूं कि अधिकांश पीपीएल उन भाषाओं से कभी नहीं मिलेंगे जिनके पास टॉपर और टॉपर इनवायरेंट का एक अलग परिणाम है।
स्टेफान्वड्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.