2010-12-30 2 views
0

Я ищу способ конвертировать Unicode UTF-32 (int) в нижний регистр. В Java, что-то вроде этого, будет делать трюк:C# UTF-32 ToLower

Character.toChars(Character.toLowerCase(Character.codePointAt(text, i))) 

У меня есть UTF-32 из Char.ConvertToUtf32, но не кажется, что должен быть способ понизить случай это значение.

ОБНОВЛЕНИЕ: Я имею дело с потоком/массивом символов, я нашел точки кода, ища суррогат hi, несколько похожий на вышеперечисленный Java-снип. Преобразование вперед и назад в String будет неэффективным.

+0

Можно ли получить байты, которые составляют данные Utf32? –

+0

Да, у меня есть массив символов. – Scott

+0

Я обновил свой ответ. –

ответ

0

Единственный встроенный способ сделать это - преобразовать UTF-32 в строку. Что-то вроде следующего должно работать:

static Int32 ToLower(Int32 c) 
{ 
    // Convert UTF-32 character to a UTF-16 String. 
    var strC = Char.ConvertFromUtf32(c); 

    // Casing rules depends on the culture. 
    // Consider using ToLowerInvariant(). 
    var lower = strC.ToLower(); 

    // Convert the UTF-16 String back to UTF-32 character and return it. 
    return Char.ConvertToUtf32(lower, 0); 
} 

Вы указываете, что это неэффективно для ваших нужд. Вы сравнили это?

Если вы все еще настаиваете на том, чтобы делать обсадную трубу на UTF-32, вам нужно будет свернуть самостоятельно. К счастью, Консорциум Unicode проделал большую часть тяжелой работы. Взгляните на Unicode case folding file. Разберите этот файл, сохраняя данные в соответствующей структуре. Затем корпус можно сделать прямо против этого с вашими данными в любом формате, который вы предпочитаете.

+0

Когда вы считаете «ToLowerInvariant», убедитесь, что вы задумались о том, что произойдет в Турции, когда вы в нижнем регистре «Я». –