2012-03-08 1 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

+1

[Что является основанием для второго теста?] (Http://stackoverflow.com/a/9617044/7724) Что бы вы ожидали, что на самом деле будут иметься две строки верхнего строфа? Ожидаете ли вы, что U00b5 останется неизменным, так как это «не письмо»? Кроме того, здесь не задействован ASCII. – bzlm

+0

И почему вы ** не ** использовали 'CultureInfo'? Если вы знаете, что это правильно делать? – Oded

ответ

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 для прописных букв для i.] (Http: //stackoverflow.com/a/3550226/7724) – bzlm

+0

достаточно честный; Я должен был сказать «в отсутствие какой-либо информации о культуре». И у того файла данных, к которому я привязан, есть свои проблемы ... например, он говорит, что нижний регистр 'U + 1E9E (ẞ)' является 'U + 00DF (ß)'. Но 'U + 00DF (ß)' не имеет эквивалента в верхнем регистре! Тем не менее, это официально. –

+0

[Складной документ также является официальным.] (Ftp://ftp.unicode.org/Public/UNIDATA/CaseFolding.txt) :) – bzlm

4

Микросекунда по-прежнему представляет собой μSEC после верхнего корпуса. Ускорение его до MSEC могло бы изменить его значение. Вот почему для глифа есть два ключевых слова.

+0

проблема уже была решена, и я думаю, что парень, который сделал это правильно. в моем случае (микро) имеет 2 'значения': физический символ, как вы упомянули, и греческое письмо. Оба имеют сопоставления в таблице Unicode, которые указывают на один и тот же символ. – dcg

+0

Я не был уверен в том, что «Извините, но так определен Unicode», поэтому я разместил свой собственный. Это нормально. –

+0

Я согласен с Гансом, очевидно, что 0xB5 не должно иметь буквы в верхнем регистре или не классифицироваться как строчная буква (Ll), а как Po (знак препинания другой). ИМО это ошибка в Юникоде. –