แก้ไขหลังจากการรวมคำถามนี้กับวิธีเปรียบเทียบ 'μ' และ 'µ' ใน C #
คำตอบเดิมที่โพสต์:
"μ".ToUpper().Equals("µ".ToUpper());
แก้ไข
หลังจากที่ได้อ่านความคิดเห็นที่ใช่มันไม่ดีที่จะใช้วิธีการดังกล่าวข้างต้นเพราะมันอาจให้ผลลัพธ์ที่ไม่ถูกต้องสำหรับประเภทอื่น ๆ บางส่วนของปัจจัยการผลิตสำหรับวันนี้เราควรใช้ปกติโดยใช้การสลายตัวเข้ากันได้เต็มรูปแบบตามที่กล่าวไว้ในวิกิพีเดีย (ขอบคุณคำตอบที่โพสต์โดยBoltClock )
static string GREEK_SMALL_LETTER_MU = new String(new char[] { '\u03BC' });
static string MICRO_SIGN = new String(new char[] { '\u00B5' });
public static void Main()
{
string Mus = "µμ";
string NormalizedString = null;
int i = 0;
do
{
string OriginalUnicodeString = Mus[i].ToString();
if (OriginalUnicodeString.Equals(GREEK_SMALL_LETTER_MU))
Console.WriteLine(" INFORMATIO ABOUT GREEK_SMALL_LETTER_MU");
else if (OriginalUnicodeString.Equals(MICRO_SIGN))
Console.WriteLine(" INFORMATIO ABOUT MICRO_SIGN");
Console.WriteLine();
ShowHexaDecimal(OriginalUnicodeString);
Console.WriteLine("Unicode character category " + CharUnicodeInfo.GetUnicodeCategory(Mus[i]));
NormalizedString = OriginalUnicodeString.Normalize(NormalizationForm.FormC);
Console.Write("Form C Normalized: ");
ShowHexaDecimal(NormalizedString);
NormalizedString = OriginalUnicodeString.Normalize(NormalizationForm.FormD);
Console.Write("Form D Normalized: ");
ShowHexaDecimal(NormalizedString);
NormalizedString = OriginalUnicodeString.Normalize(NormalizationForm.FormKC);
Console.Write("Form KC Normalized: ");
ShowHexaDecimal(NormalizedString);
NormalizedString = OriginalUnicodeString.Normalize(NormalizationForm.FormKD);
Console.Write("Form KD Normalized: ");
ShowHexaDecimal(NormalizedString);
Console.WriteLine("_______________________________________________________________");
i++;
} while (i < 2);
Console.ReadLine();
}
private static void ShowHexaDecimal(string UnicodeString)
{
Console.Write("Hexa-Decimal Characters of " + UnicodeString + " are ");
foreach (short x in UnicodeString.ToCharArray())
{
Console.Write("{0:X4} ", x);
}
Console.WriteLine();
}
เอาต์พุต
INFORMATIO ABOUT MICRO_SIGN
Hexa-Decimal Characters of µ are 00B5
Unicode character category LowercaseLetter
Form C Normalized: Hexa-Decimal Characters of µ are 00B5
Form D Normalized: Hexa-Decimal Characters of µ are 00B5
Form KC Normalized: Hexa-Decimal Characters of µ are 03BC
Form KD Normalized: Hexa-Decimal Characters of µ are 03BC
________________________________________________________________
INFORMATIO ABOUT GREEK_SMALL_LETTER_MU
Hexa-Decimal Characters of µ are 03BC
Unicode character category LowercaseLetter
Form C Normalized: Hexa-Decimal Characters of µ are 03BC
Form D Normalized: Hexa-Decimal Characters of µ are 03BC
Form KC Normalized: Hexa-Decimal Characters of µ are 03BC
Form KD Normalized: Hexa-Decimal Characters of µ are 03BC
________________________________________________________________
ขณะอ่านข้อมูลในUnicode_equivalenceฉันพบ
การเลือกเกณฑ์การเทียบเท่าอาจส่งผลต่อผลการค้นหา ตัวอย่างเช่นอักษรควบการพิมพ์บางอย่างเช่น U + FB03 (ffi) ..... ดังนั้นการค้นหา U + 0066 (f) เนื่องจากสตริงย่อยจะประสบความสำเร็จในการปรับมาตรฐานNFKCของ U + FB03 แต่ไม่อยู่ในการปรับมาตรฐานNFCของ U + FB03
ดังนั้นเพื่อเปรียบเทียบความเท่าเทียมกันโดยปกติเราควรใช้FormKC
เช่น NFKC normalization หรือFormKD
เช่น NFKD normalization
ฉันไม่ค่อยอยากรู้ข้อมูลเพิ่มเติมเกี่ยวกับอักขระ Unicode ทั้งหมดดังนั้นฉันจึงสร้างตัวอย่างซึ่งจะวนซ้ำอักขระ Unicode ทั้งหมดUTF-16
และฉันได้ผลลัพธ์บางอย่างที่ฉันต้องการพูดคุย
- ข้อมูลเกี่ยวกับอักขระที่ค่ามาตรฐาน
FormC
และFormD
ค่าปกติไม่เทียบเท่า
Total: 12,118
Character (int value): 192-197, 199-207, 209-214, 217-221, 224-253, ..... 44032-55203
- ข้อมูลเกี่ยวกับอักขระที่ค่ามาตรฐาน
FormKC
และFormKD
ค่าปกติไม่เทียบเท่า
Total: 12,245
Character (int value): 192-197, 199-207, 209-214, 217-221, 224-228, ..... 44032-55203, 64420-64421, 64432-64433, 64490-64507, 64512-64516, 64612-64617, 64663-64667, 64735-64736, 65153-65164, 65269-65274
- อักขระทั้งหมดที่มีค่าปกติ
FormC
และFormD
ค่าปกติไม่เทียบเท่ามีFormKC
และFormKD
ค่าที่ทำให้เป็นมาตรฐานไม่เทียบเท่ายกเว้นอักขระเหล่านี้อักขระ
:901 '΅', 8129 '῁', 8141 '῍', 8142 '῎', 8143 '῏', 8157 '῝', 8158 '῞'
, 8159 '῟', 8173 '῭', 8174 '΅'
- อักขระพิเศษที่มีค่าปกติ
FormKC
และFormKD
ค่าปกติไม่เท่ากัน แต่มีFormC
และFormD
ค่ามาตรฐานเป็น
Total: 119
อักขระที่เทียบเท่า:452 'DŽ' 453 'Dž' 454 'dž' 12814 '㈎' 12815 '㈏' 12816 '㈐' 12817 '㈑' 12818 '㈒'
12819 '㈓' 12820 '㈔' 12821 '㈕', 12822 '㈖' 12823 '㈗' 12824 '㈘' 12825 '㈙' 12826 '㈚'
12827 '㈛' 12828 '㈜' 12829 '㈝' 12830 '㈞' 12910 '㉮' 12911 '㉯' 12912 '㉰' 12913 '㉱'
12914 '㉲' 12915 '㉳' 12916 '㉴' 12917 '㉵' 12918 '㉶' 12919 '㉷' 12920 '㉸' 12921 '㉹' 12922 '㉺' 12923 '㉻' 12924 '㉼' 12925 '㉽' 12926 '㉾' 13056 '㌀' 13058 '㌂' 13060 '㌄' 13063 '㌇' 13070 '㌎' 13071 '㌏' 13072 '㌐' 13073 '㌑' 13075 '㌓' 13077 '㌕' 13080 '㌘' 13081 '㌙' 13082 '㌚' 13086 '㌞' 13089 '㌡' 13092 '㌤' 13093 '㌥' 13094 '㌦' 13099 '㌫' 13100 '㌬' 13101 '㌭' 13102 '㌮' 13103 '㌯' 13104 '㌰' 13105 '㌱' 13106 '㌲' 13108 '㌴' 13111 '㌷' 13112 '㌸' 13114 '㌺' 13115 '㌻' 13116 '㌼' 13117 '㌽' 13118 '㌾' 13120 '㍀' 13130 '㍊' 13131 '㍋' 13132 '㍌' 13134 '㍎' 13139 '㍓' 13140 '㍔' 13142 '㍖' .......... ﺋ' 65164 'ﺌ' 65269 'ﻵ' 65270 'ﻶ' 65271 'ﻷ' 65272 'ﻸ' 65273 'ﻹ' 65274'
- มีอักขระบางตัวที่ไม่สามารถทำให้เป็นมาตรฐานได้พวกเขาจะโยน
ArgumentException
ถ้าพยายาม
Total:2081
Characters(int value): 55296-57343, 64976-65007, 65534
ลิงก์นี้มีประโยชน์มากในการทำความเข้าใจว่ากฎใดควบคุมการเทียบเท่า Unicode
- Unicode_equivalence
- Unicode_compatibility_characters