Pertanyaan Dalam C # apa perbedaan antara ToUpper () dan ToUpperInvariant ()?


Dalam C #, apa bedanya ToUpper() dan ToUpperInvariant()?

Bisakah Anda memberikan contoh di mana hasilnya mungkin berbeda?


107
2017-08-23 17:49


asal


Jawaban:


ToUpper menggunakan budaya saat ini. ToUpperInvariant menggunakan budaya invarian.

Contoh kanoniknya adalah Turki, di mana huruf besar "i" bukan "I".

Contoh kode yang menunjukkan perbedaan:

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);
    }
}

Untuk lebih lanjut tentang Turki, lihat ini Pos blog Uji Turki.

Saya tidak akan terkejut mendengar bahwa ada berbagai masalah kapitalisasi lain di sekitar karakter elided dll. Ini hanyalah salah satu contoh yang saya tahu dari atas kepala saya ... sebagian karena itu menggigit saya beberapa tahun yang lalu di Jawa, di mana saya berada di atas -Mengisi string dan membandingkannya dengan "MAIL". Itu tidak bekerja dengan baik di Turki ...


130
2017-08-23 17:51



Jawaban Jon sempurna. Saya hanya ingin menambahkan itu ToUpperInvariant sama dengan menelepon ToUpper(CultureInfo.InvariantCulture).

Itu membuat contoh Jon sedikit lebih sederhana:

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 }, 
            }
        });
    }
}

Saya juga digunakan New Times Roman karena itu font yang lebih keren.

Saya juga mengatur Form's Font properti, bukan keduanya Label kontrol karena Font properti diwariskan.

Dan saya mengurangi beberapa baris lainnya hanya karena saya suka kode compact (contoh, bukan produksi).

Saya benar-benar tidak ada yang lebih baik untuk dilakukan saat ini.


23
2017-08-23 19:13



Mulai dengan MSDN

http://msdn.microsoft.com/en-us/library/system.string.toupperinvariant.aspx

Metode ToUpperInvariant adalah   setara dengan   ToUpper (CultureInfo.InvariantCulture)

Hanya karena modal saya aku s 'SAYA' dalam bahasa Inggris, tidak selalu membuatnya demikian.


14
2017-08-23 17:51



String.ToUpper dan String.ToLower dapat memberikan hasil yang berbeda mengingat budaya yang berbeda. Contoh yang paling dikenal adalah contoh Turki, yang mengkonversi huruf kecil latin "i" ke huruf besar, tidak menghasilkan huruf latin "I", tetapi dalam bahasa Turki "I".

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

Seperti untuk saya itu membingungkan bahkan dengan gambar di atas (sumber), Saya menulis sebuah program (lihat kode sumber di bawah) untuk melihat keluaran yang tepat untuk contoh Turki:

# 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)

Seperti yang Anda lihat:

  1. Huruf besar huruf kecil dan huruf kecil lowercasing memberikan hasil yang berbeda untuk budaya invarian dan budaya Turki.
  2. Huruf besar huruf besar dan huruf kecil tidak berpengaruh, tidak peduli apa pun kulturnya.
  3. Culture.CultureInvariant meninggalkan karakter turki apa adanya
  4. ToUpper dan ToLower bersifat reversibel, yaitu menurunkan karakter setelah menguncinya, membawanya ke bentuk aslinya, selama kedua operasi digunakan budaya yang sama.

Menurut MSDN, untuk Char.ToUpper dan Char.ToLower Turki dan Azeri adalah satu-satunya budaya yang terpengaruh karena mereka adalah satu-satunya yang memiliki perbedaan casing karakter tunggal. Untuk string, mungkin ada lebih banyak budaya yang terpengaruh.


Kode sumber aplikasi konsol yang digunakan untuk menghasilkan output:

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})";
        }
    }
}

6
2018-04-28 12:02



http://msdn.microsoft.com/en-us/library/system.string.toupperinvariant.aspx

Dokumentasi Microsoft menjelaskan perbedaan dan memberikan contoh hasil yang berbeda.


4
2017-08-23 17:51



ToUpperInvariant menggunakan aturan dari budaya invarian


3
2017-08-23 17:52



tidak ada perbedaan dalam bahasa inggris. hanya dalam budaya turki perbedaan bisa ditemukan.


2
2017-08-23 17:53