2010-08-23 16 views
104

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

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

+3

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

उत्तर

117

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

कैननिकल उदाहरण तुर्की है, जहां "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); 
    } 
} 

तुर्की के बारे में अधिक के लिए, यह Turkey Test blog post देखते हैं।

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

+34

हाहा मैंने यह सोच पढ़ा ... "तुर्की" में 'I' अक्षर नहीं है " –

+3

फिडल इसे चित्रित करता है: https://dotnetfiddle.net/x3uqwa – KorsG

3

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

+12

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

+2

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

+0

यकीन है कि कुछ अन्य होना चाहिए। अधिकांश पीपीएल कभी भी प्रोग्रामिंग में उन भाषाओं को कभी भी पूरा नहीं करेगा – Stefanvds

19

जॉन का जवाब सही है। मैं बस 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 संपत्ति विरासत में मिला है निर्धारित किया है।

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

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

+4

"जॉन का जवाब सही है।" एक अनावश्यक बयान के बारे में बात करो। ;) – krillgar

+1

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

+0

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

3

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

Capitalization of I depending on culture, upper row - lower case letters, lower row - upper case letters

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

# 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. लोअर केस अक्षरों Uppercasing और अपर केस पत्र lowercasing अपरिवर्तनीय संस्कृति और तुर्की पंथ के लिए विभिन्न परिणाम देते हैं ure।
  2. अपरकेसिंग ऊपरी केस अक्षरों और लोअरकेसिंग लोअर केस अक्षरों का कोई प्रभाव नहीं पड़ता है, इससे कोई फर्क नहीं पड़ता कि संस्कृति क्या है।
  3. Culture.CultureInvariant तुर्की वर्ण छोड़ देता है के रूप में है
  4. ToUpper और ToLower पूर्ववत किया जा सकता है कि यह uppercasing के बाद एक चरित्र lowercasing है, मूल रूप के यह लाता है, जब तक दोनों के संचालन के लिए के रूप में ही संस्कृति इस्तेमाल किया गया था।

MSDN के अनुसार, Char.ToUpper और Char.ToLower तुर्की और अज़ेरी के लिए केवल प्रभावित संस्कृतियों क्योंकि वे एकल चरित्र आवरण अंतर के साथ ही लोगों को कर रहे हैं। तारों के लिए, अधिक संस्कृतियां प्रभावित हो सकती हैं। एक सांत्वना आवेदन उत्पादन उत्पन्न करने के लिए प्रयोग किया जाता का


स्रोत कोड:

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})"; 
     } 
    } 
} 
संबंधित मुद्दे