.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) должен был остаться прежним ... Может ли кто-нибудь помочь мне понять, почему это происходит?

Кстати, здесь есть еще одна тема - Как правильно вводить греческие слова в верхнем регистре в. NET?, но однозначного ответа нет ...

Спасибо. Д.


person dcg    schedule 08.03.2012    source источник
comment
ToUpper использует текущий CultureInfo (если не передается информация о культуре). Какой у вас current CultureInfo`?   -  person Aliostad    schedule 08.03.2012
comment
Какое обоснование для второго теста? Какими на самом деле будут две строки в верхнем регистре? Ожидаете ли вы, что U00b5 останется неизменным, поскольку на самом деле это не буква? Кроме того, здесь не используется ASCII.   -  person bzlm    schedule 08.03.2012
comment
И почему вы не использовали CultureInfo? Если вы знаете, что это правильно?   -  person Oded    schedule 08.03.2012
comment
@Oded CultureInfo или нет, здесь не так уж важно, не так ли? Второе утверждение неверно согласно спецификациям Unicode.   -  person bzlm    schedule 08.03.2012
comment
@bzlm - Справедливо, сначала не проверял спецификацию, но OP заявляет, что ему следовало использовать CultureInfo. Я спрашивал, почему он этого не сделал.   -  person Oded    schedule 08.03.2012
comment
@bzlm - да, я (или «был») ожидал, что для \ u00b5 будет такой же символ, особенно учитывая, что это не «часть» греческого алфавита. Его первоначальная цель была совершенно другой.   -  person dcg    schedule 08.03.2012
comment
@Oded - я не могу установить данную информацию о культуре, потому что я использую ее в поиске в международном приложении с многоязычной базой данных.   -  person dcg    schedule 08.03.2012


Ответы (2)


Некоторые строчные буквы имеют такой же эквивалент в верхнем регистре. Извините, но именно так определяется Unicode.

Например, как вы можете видеть в официальном UnicodeData.txt, как U+0069 (i), так и U+0131 (ı) U+0049 (I) для прописных букв.

Какая именно у вас проблема? Может, мы сможем помочь.

person Mr Lister    schedule 08.03.2012
comment
Справедливо; Я должен был сказать из-за отсутствия какой-либо информации о культуре. И этот файл данных, с которым я связался, имеет свои собственные проблемы ... например, он говорит, что нижний регистр U+1E9E (ẞ) равен U+00DF (ß). Но U+00DF (ß) не имеет эквивалента в верхнем регистре! Тем не менее, это официально. - person Mr Lister; 08.03.2012
comment
@ Мистер Листер - да, это проблема, с которой я столкнулся. Спасибо за Ваш ответ. Теперь все ясно. - person dcg; 08.03.2012

После верхнего кожуха микросекунда все еще остается µSEC. Передача его в MSEC фатально изменила бы его смысл. Вот почему для глифа есть две кодовые точки.

person Hans Passant    schedule 08.03.2012
comment
проблема уже решена, и я думаю, что парень, который это сделал, прав. в моем случае (микро) имеет 2 «значения»: физический символ, как вы упомянули, и греческое письмо. Оба имеют сопоставления в таблице Unicode, которые указывают на один и тот же символ. - person dcg; 28.04.2012
comment
Извините, меня не убедил, но именно так определяется ответ Unicode, поэтому я опубликовал свой собственный. В SO это нормально. - person Hans Passant; 28.04.2012
comment
Я согласен с Хансом, ясно, что 0xB5 не должен иметь заглавную букву или классифицироваться как строчная буква (Ll), но как Po (другая пунктуация). ИМО, это ошибка Unicode. - person Panos Theof; 07.01.2014