ใน C # ความแตกต่างระหว่างToUpper()
และToUpperInvariant()
อย่างไร?
คุณช่วยยกตัวอย่างที่ผลลัพธ์อาจแตกต่างกันได้ไหม
ใน C # ความแตกต่างระหว่างToUpper()
และToUpperInvariant()
อย่างไร?
คุณช่วยยกตัวอย่างที่ผลลัพธ์อาจแตกต่างกันได้ไหม
คำตอบ:
ToUpper
ใช้วัฒนธรรมปัจจุบัน ToUpperInvariant
ใช้วัฒนธรรมที่ไม่แปรเปลี่ยน
ตัวอย่างตามรูปแบบบัญญัติคือตุรกีโดยตัวพิมพ์ใหญ่ของ "i" ไม่ใช่ "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);
}
}
สำหรับข้อมูลเพิ่มเติมเกี่ยวตุรกี, เห็นนี้โพสต์บล็อกตุรกีทดสอบ
ฉันจะไม่แปลกใจที่ได้ยินว่ามีปัญหาการใช้อักษรตัวพิมพ์ใหญ่อื่น ๆ อีกมากมายเกี่ยวกับอักขระที่มีการเล็ดลอด ฯลฯ นี่เป็นเพียงตัวอย่างหนึ่งที่ฉันรู้จากด้านบนของหัว ... - ใส่สายอักขระและเปรียบเทียบกับ "MAIL" นั่นไม่ได้ผลดีนักในตุรกี ...
ımage
เป็นชื่อฟิลด์Image
และ Unity 3D ส่งสแปมข้อผิดพลาดภายในไปยังคอนโซลUnable to find key name that matches 'rıght'
บน Windows "ภาษาอังกฤษ" พร้อมการตั้งค่าภูมิภาคตุรกีสำหรับวันที่และเวลา ดูเหมือนว่าบางครั้ง Microsoft จะล้มเหลวในการทดสอบภาษาตุรกีภาษาของพีซีไม่ใช่ภาษาตุรกีเลย
คำตอบของจอนสมบูรณ์แบบ ฉันแค่อยากจะเพิ่มว่าเป็นเช่นเดียวกับการเรียก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 },
}
});
}
}
ฉันยังใช้New Times Romanเพราะเป็นแบบอักษรที่เย็นกว่า
ฉันยังตั้งForm
ของFont
สถานที่ให้บริการแทนของทั้งสองLabel
การควบคุมเพราะFont
คุณสมบัติที่เป็นกรรมพันธุ์
และฉันลดบรรทัดอื่น ๆ ลงเล็กน้อยเพียงเพราะฉันชอบโค้ดขนาดกะทัดรัด (ตัวอย่างไม่ใช่การผลิต)
ฉันไม่มีอะไรดีไปกว่าที่จะทำในขณะนี้
เริ่มต้นด้วย MSDN
http://msdn.microsoft.com/en-us/library/system.string.toupperinvariant.aspx
วิธี ToUpperInvariant เทียบเท่ากับ ToUpper (CultureInfo.InvariantCulture)
เพียงเพราะเมืองหลวงที่ฉันเป็น"ฉัน"ในภาษาอังกฤษไม่ได้เป็นเช่นนั้นเสมอไป
String.ToUpper
และString.ToLower
สามารถให้ผลลัพธ์ที่แตกต่างกันตามวัฒนธรรมที่แตกต่างกัน ตัวอย่างที่รู้จักกันมากที่สุดคือตัวอย่างภาษาตุรกีซึ่งการแปลงภาษาละติน "i" ตัวพิมพ์เล็กให้เป็นตัวพิมพ์ใหญ่จะไม่ส่งผลให้เป็น "I" ในภาษาละติน แต่เป็น "I" ในภาษาตุรกี
สำหรับฉันมันสับสนแม้จะมีภาพด้านบน (ที่มา ) ฉันเขียนโปรแกรม (ดูซอร์สโค้ดด้านล่าง) เพื่อดูผลลัพธ์ที่แน่นอนสำหรับตัวอย่างภาษาตุรกี:
# 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)
อย่างที่เห็น:
Culture.CultureInvariant
ปล่อยให้อักขระตุรกีตามที่เป็นอยู่ToUpper
และToLower
สามารถย้อนกลับได้ซึ่งจะลดขนาดอักขระลงหลังจากตัวพิมพ์ใหญ่แล้วนำไปสู่รูปแบบดั้งเดิมตราบเท่าที่การดำเนินการทั้งสองใช้วัฒนธรรมเดียวกันตาม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})";
}
}
}
ToUpperInvariant
ใช้กฎจากวัฒนธรรมที่ไม่แปรเปลี่ยน
ไม่มีความแตกต่างในภาษาอังกฤษ เฉพาะในวัฒนธรรมตุรกีเท่านั้นที่สามารถพบความแตกต่างได้