C # arasındaki fark nedir ToUpper()
ve ToUpperInvariant()
?
Sonuçların farklı olabileceği bir örnek verebilir misiniz?
C # arasındaki fark nedir ToUpper()
ve ToUpperInvariant()
?
Sonuçların farklı olabileceği bir örnek verebilir misiniz?
Yanıtlar:
ToUpper
mevcut kültürü kullanır. ToUpperInvariant
değişmez kültürü kullanır.
Kanonik örnek, "i" nin büyük harfinin "ben" olmadığı Türkiye'dir.
Farkı gösteren örnek kod:
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);
}
}
Türkçe hakkında daha fazla bilgi için bu Turkey Test blog gönderisine bakın .
Seçilmiş karakterlerle ilgili başka çeşitli büyük harf kullanımı sorunları olduğunu duymak beni şaşırtmaz. Bu, kafamın tepesinden bildiğim bir örnektir ... kısmen de yıllar önce Java'da beni ısırdığı için - bir dizgeyi "POSTA" ile karşılaştırmak. Türkiye'de pek işe yaramadı ...
ımage
için bir alan adı öneren Visual Studio'yu görüyorum . Görünüşe göre bazen Microsoft bile Türkiye testini geçemiyor, bir bilgisayarın dili Türkçe bile değil, sadece lol. Image
Unable to find key name that matches 'rıght'
Jon'un cevabı mükemmel. Sadece aramakla ToUpperInvariant
aynı şey olduğunu eklemek istedim ToUpper(CultureInfo.InvariantCulture)
.
Bu Jon'un örneğini biraz daha basitleştirir:
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 },
}
});
}
}
Ayrıca New Times Roman'ı kullandım çünkü daha güzel bir yazı tipi.
Özellik miras alındığı için iki denetim yerine Form
's Font
özelliğini de ayarlıyorum .Label
Font
Ve sırf kompakt (örneğin, üretimi değil) kodu sevdiğim için diğer birkaç satırı azalttım.
Şu anda gerçekten yapacak daha iyi bir şeyim yoktu.
MSDN ile başlayın
http://msdn.microsoft.com/en-us/library/system.string.toupperinvariant.aspx
ToUpperInvariant yöntemi ToUpper'a eşdeğerdir (CultureInfo.InvariantCulture)
Sermaye Çünkü ben ise 'Ben' İngilizce, hep öyle yapmaz.
String.ToUpper
ve String.ToLower
farklı kültürlere göre farklı sonuçlar verebilir. En bilinen örnek, küçük harfli latin "i" nin büyük harfe dönüştürülmesinin büyük harfle yazılmış latin "I" ile sonuçlanmadığı ancak Türkçe "I" ile sonuçlandığı Türkçe örnektir .
Bana gelince, yukarıdaki resimle ( kaynak ) bile kafa karıştırıcıydı , Türkçe örnek için tam çıktıyı görmek için bir program yazdım (aşağıdaki kaynak koduna bakın):
# 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)
Gördüğün gibi:
Culture.CultureInvariant
Türk karakterleri olduğu gibi bırakıyorToUpper
ve ToLower
tersine çevrilebilir, yani bir karakteri büyük harfe dönüştürdükten sonra küçültmek, her iki işlem için de aynı kültür kullanıldığı sürece onu orijinal forma getirir.Göre MSDN onlar tek karakterlik kasa farkları sadece onlar çünkü Char.ToUpper ve Char.ToLower Türkçesi ve Azeri yalnızca etkilenen kültürler vardır. İpler için, etkilenen daha fazla kültür olabilir.
Çıktı oluşturmak için kullanılan bir konsol uygulamasının kaynak kodu:
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, değişmez kültürden kuralları kullanır
ingilizcede fark yok. sadece türk kültüründe bir farklılık bulunabilir.