Trong C #, sự khác biệt giữa ToUpper()
và là ToUpperInvariant()
gì?
Bạn có thể đưa ra một ví dụ mà kết quả có thể khác nhau?
Trong C #, sự khác biệt giữa ToUpper()
và là ToUpperInvariant()
gì?
Bạn có thể đưa ra một ví dụ mà kết quả có thể khác nhau?
Câu trả lời:
ToUpper
sử dụng văn hóa hiện tại. ToUpperInvariant
sử dụng văn hóa bất biến.
Ví dụ kinh điển là Thổ Nhĩ Kỳ, trong đó chữ hoa của chữ "i" không phải là "tôi".
Mã mẫu cho thấy sự khác biệt:
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);
}
}
Để biết thêm về tiếng Thổ Nhĩ Kỳ, xem bài đăng blog Thử nghiệm Thổ Nhĩ Kỳ này .
Tôi sẽ không ngạc nhiên khi biết rằng có nhiều vấn đề viết hoa khác xung quanh các nhân vật bị tách biệt, v.v ... Đây chỉ là một ví dụ tôi biết trên đỉnh đầu của mình ... một phần vì nó làm tôi bực mình nhiều năm trước ở Java, nơi tôi ở trên -tạo một chuỗi và so sánh nó với "MAIL". Điều đó đã không làm việc rất tốt ở Thổ Nhĩ Kỳ ...
ımage
làm tên trường Image
và Unity 3D đang spam một lỗi nội bộ đối với bảng điều khiển Unable to find key name that matches 'rıght'
trên Windows "tiếng Anh" với cài đặt khu vực Thổ Nhĩ Kỳ theo ngày và giờ. Có vẻ như đôi khi Microsoft thất bại trong bài kiểm tra Thổ Nhĩ Kỳ, ngôn ngữ của PC thậm chí không phải là tiếng Thổ Nhĩ Kỳ, chỉ là lol.
Câu trả lời của Jon là hoàn hảo. Tôi chỉ muốn thêm đó ToUpperInvariant
là giống như gọi ToUpper(CultureInfo.InvariantCulture)
.
Điều đó làm cho ví dụ của Jon đơn giản hơn một chút:
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 },
}
});
}
}
Tôi cũng đã sử dụng New Times Roman vì đây là một phông chữ hay hơn.
Tôi cũng đặt Form
của Font
tài sản thay vì hai Label
điều khiển bởi vì Font
tài sản được thừa hưởng.
Và tôi đã giảm một vài dòng khác chỉ vì tôi thích mã nhỏ gọn (ví dụ, không sản xuất).
Tôi thực sự không có gì tốt hơn để làm vào lúc này.
Bắt đầu với MSDN
http://msdn.microsoft.com/en-us/l Library / system.opes.toupperinvariant.aspx
Phương thức ToUpperInvariant tương đương với ToUpper (CultureInfo.InvariantCARM)
Chỉ vì một chữ hoa tôi là 'Tôi' bằng tiếng Anh, không phải lúc nào cũng làm như vậy.
String.ToUpper
và String.ToLower
có thể đưa ra kết quả khác nhau cho các nền văn hóa khác nhau. Ví dụ được biết đến nhiều nhất là ví dụ tiếng Thổ Nhĩ Kỳ , trong đó chuyển đổi chữ "i" chữ thường thành chữ hoa, không dẫn đến chữ "I" được viết hoa, nhưng trong chữ "I" trong tiếng Thổ Nhĩ Kỳ.
Đối với tôi thật khó hiểu ngay cả với hình trên ( nguồn ), tôi đã viết một chương trình (xem mã nguồn bên dưới) để xem đầu ra chính xác cho ví dụ tiếng Thổ Nhĩ Kỳ:
# 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)
Bạn có thể thấy:
Culture.CultureInvariant
để lại các ký tự Thổ Nhĩ KỳToUpper
và ToLower
có thể đảo ngược, đó là hạ thấp một nhân vật sau khi vượt qua nó, đưa nó về dạng ban đầu, miễn là đối với cả hai hoạt động, cùng một nền văn hóa đã được sử dụng.Theo MSDN , đối với Char.ToUpper và Char.ToLower Thổ Nhĩ Kỳ và Azeri là những nền văn hóa duy nhất bị ảnh hưởng bởi vì họ là những người duy nhất có sự khác biệt về vỏ bọc một ký tự. Đối với chuỗi, có thể có nhiều nền văn hóa bị ảnh hưởng.
Mã nguồn của ứng dụng giao diện điều khiển được sử dụng để tạo đầu ra:
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 sử dụng các quy tắc từ văn hóa bất biến
không có sự khác biệt trong tiếng Anh. chỉ trong văn hóa Thổ Nhĩ Kỳ một sự khác biệt có thể được tìm thấy.