2012-03-08 54 views
1

我有以下代碼:.NET微(μ)希臘字母大寫問題

string firstMicro = "aa \u00b5 bb"; 
string secondMicro = "aa \u03bc bb"; 

Assert.IsFalse(firstMicro == secondMicro); 

string upperFirstMicro = firstMicro.ToUpper(); 
string upperSecondMicro = secondMicro.ToUpper(); 

Assert.IsFalse(upperFirstMicro == upperSecondMicro); 

在我的情況中,第一測試通過(顯然,兩個字符串是不同的),但在第二情況下,測試因爲兩個文本是相同的($ AA M BB)。我承認,在其中一種情況下,我應該使用CultureInfo - 但至少在第一種情況下(ASCII代碼中的微號)應該保持不變......有人可以幫助我理解爲什麼會發生這種情況?

Aparently,這裏還有另外一個話題 - How to correctly uppercase Greek words in .NET?,但沒有明顯的答案...

感謝。 D.

+0

ToUpper使用當前的CultureInfo(除非傳遞文化信息)。你現在的'CultureInfo'是什麼? – Aliostad 2012-03-08 11:37:08

+1

[第二次測試的基本原理是什麼?](http://stackoverflow.com/a/9617044/7724)你會期望得到的兩個大寫字符串實際上是什麼?你會期望U00b5不會改變,因爲它「不是一封信」?另外,這裏不涉及ASCII。 – bzlm 2012-03-08 11:37:22

+0

爲什麼你**不**使用'CultureInfo'?如果你知道它正確的做法? – Oded 2012-03-08 11:37:30

回答

3

一些小寫字母具有相同的大寫形式。對不起,但這就是Unicode的定義。

例如,正如您在官方UnicodeData.txt中看到的那樣,U+0069 (i)U+0131 (ı)都有大寫的U+0049 (I)

你有什麼確切的問題?也許我們可以幫忙。

+1

[壞例子](http://www.fileformat.info/info/unicode/char/0069/index.htm)[土耳其語'CultureInfo'沒有用於大寫的U + 0049](http: //stackoverflow.com/a/3550226/7724) – bzlm 2012-03-08 11:45:29

+0

夠公平的;我應該說「沒有任何文化信息」。我鏈接的那個數據文件確實有它自己的問題......例如,它說'U + 1E9E(ẞ)'的小寫字母是'U + 00DF(ß)'。但是'U + 00DF(ß)'沒有大寫字母!不過,它是官方的。 – 2012-03-08 11:52:22

+0

[該摺疊文件也是官方。](ftp://ftp.unicode.org/Public/UNIDATA/CaseFolding.txt):) – bzlm 2012-03-08 11:53:08

4

上殼後微秒仍然是μSEC。將它提升到MSEC會致命地改變它的含義。這就是爲什麼字形有兩個碼點的原因。

+0

問題已經得到解答,我認爲做這件事的人是正確的。在我的情況下,(微)有2'含義':你提到的物理符號和希臘字母。兩者都有指向相同字符的unicode表中的映射。 – dcg 2012-04-28 09:23:02

+0

我並不確信「對不起,但這就是Unicode的定義」的答案,所以我發佈了自己的。這在SO中完全沒問題。 – 2012-04-28 09:31:12

+0

我同意漢斯,顯然0xB5不應該有一個大寫字母,也不應該分類爲小寫字母(Ll),但作爲寶(標點符號)。 IMO是Unicode中的一個錯誤。 – 2014-01-07 17:45:44