Dalam C #, apa perbedaan antara ToUpper()
dan ToUpperInvariant()
?
Bisakah Anda memberi contoh di mana hasilnya mungkin berbeda?
Dalam C #, apa perbedaan antara ToUpper()
dan ToUpperInvariant()
?
Bisakah Anda memberi contoh di mana hasilnya mungkin berbeda?
Jawaban:
ToUpper
menggunakan budaya saat ini. ToUpperInvariant
menggunakan budaya invarian.
Contoh kanonik adalah Turki, di mana huruf "i" bukan "aku".
Kode sampel 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 bahasa Turki, lihat posting blog Tes Turki ini .
Saya tidak akan terkejut mendengar bahwa ada berbagai masalah kapitalisasi lain di sekitar karakter yang dihapus dll -menarik string dan membandingkannya dengan "MAIL". Itu tidak bekerja dengan baik di Turki ...
ımage
sebagai nama bidang untuk Image
dan Unity 3D spamming kesalahan internal ke konsol Unable to find key name that matches 'rıght'
pada Windows "Inggris" dengan pengaturan regional Turki untuk tanggal dan waktu. Sepertinya kadang-kadang bahkan Microsoft gagal dalam tes Turki, bahasa PC bahkan bukan Turki, hanya lol.
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 menggunakan New Times Roman karena ini adalah font yang lebih keren.
Saya juga mengatur Form
's Font
properti bukannya dua Label
kontrol karena Font
properti diwariskan.
Dan saya mengurangi beberapa baris lain hanya karena saya suka kode kompak (misalnya, bukan produksi).
Saya benar-benar tidak memiliki hal yang lebih baik untuk dilakukan saat ini.
Mulai dengan MSDN
http://msdn.microsoft.com/en-us/library/system.string.toupperinvariant.aspx
Metode ToUpperInvariant setara dengan ToUpper (CultureInfo.InvariantCulture)
Hanya karena modal saya adalah 'saya' dalam bahasa Inggris, tidak selalu membuatnya demikian.
String.ToUpper
dan String.ToLower
dapat memberikan hasil yang berbeda mengingat budaya yang berbeda. Contoh yang paling dikenal adalah contoh Turki , yang mengubah huruf latin "i" menjadi huruf kapital, tidak menghasilkan huruf latin "I", tetapi dalam bahasa Turki "I".
Bagi saya itu membingungkan bahkan dengan gambar di atas ( sumber ), saya menulis sebuah program (lihat kode sumber di bawah) untuk melihat output 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:
Culture.CultureInvariant
meninggalkan karakter Turki apa adanyaToUpper
dan ToLower
bersifat reversibel, yaitu menurunkan karakter setelah menaikkannya, membawanya ke bentuk asli, selama kedua operasi budaya yang sama digunakan.Menurut MSDN , untuk Char.ToUpper dan Char.ToLower Turki dan Azeri adalah satu-satunya budaya yang terpengaruh karena mereka adalah satu-satunya dengan 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})";
}
}
}
ToUpperInvariant menggunakan aturan dari budaya invarian
tidak ada perbedaan dalam bahasa inggris. hanya dalam budaya Turki perbedaan dapat ditemukan.