2010-09-08 4 views
5

У меня есть строка, содержащая символы UTF-8, и у меня есть метод, который должен преобразовать каждый символ в верхний или нижний регистр, это легко сделать с символами которые перекрываются с ASCII, и, очевидно, некоторые символы не могут быть преобразованы, например любой китайский характер. Однако есть хороший способ обнаружить и преобразовать другие символы, которые могут быть верхними/нижними, например. все греческие персонажи? Также обратите внимание, что мне нужно сделать это как на Windows, так и на Linux.Преобразование символов UTF-8 в верхний/нижний регистр C++

Спасибо,

+0

Важно получить правильную терминологию здесь, чтобы получить полезный ответ. UTF-8 - кодировка символов, указанная в RFC 3629 (и в другом месте); он содержит алгоритмы для отображения между символами Unicode и октетными последовательностями, которые представляют эти символы переносимо. Пожалуйста, будьте точны с типами; еще лучше, покажите код, включающий объявления и типы. –

+1

Грег ваш комментарий не имеет для меня никакого смысла, извините, но у меня пока нет кода. Я пытаюсь выяснить, как что-то сделать, не пытаться отладить что-то, что неправильно работает, так что это не имеет смысла для меня, также Я знаю, что UTF-8 - это кодирование, но это действительно не меняет того, что я пытаюсь достичь, который развивает средство, с помощью которого можно перейти от «a» -> «A» или от «Ω» -> «ω», – NSA

+0

Какова цель? Вы собираетесь использовать его для сравнения таких обработанных строк? Я предполагаю, что вы хотите использовать его для такого сравнения. Вы понимаете, что это не будет обрабатывать такие вещи, как «ß» и «ss», эквивалентные на немецком языке? – wilx

ответ

13

Посмотрите ICU.

Обратите внимание, что функции нижнего регистра для верхнего регистра зависят от локали. Подумайте о турецкой (ascii) букве I, которая получает «бесцеремонный строчный регистр i» и (ascii) i, который получает «прописную букву I с точкой».

+0

Благодарим вас за отзыв Alexandre, однако мне не разрешено использовать это приложение для ссылок на любые сторонние библиотеки. Поэтому мне нужно выяснить, как это сделать, используя эту lib. – NSA

+0

Я предлагаю вам написать, что вы свертываете свою собственную утилиту отображения случаев, посмотрите http://www.unicode.org/faq/casemap_charprop.html. Оттуда вы можете скачать все специальные отображения случаев. – tidwall

+2

У C++ нет поддержки unicode. ICU - это * путь. –

2

Предполагая, что у вас есть доступ к wctype.h, затем преобразуйте текст в 2-байтную строку юникода и используйте towupper(). Затем преобразуйте его обратно в UTF-8.

+1

или использовать ICU, как упоминал Александр. – tidwall

+1

Вы не обращаетесь с немецким ß и греческим терминалом сигма таким образом. –

+0

@Alexandre C .: Независимо от того, преобразуются ли символы, подобные этому, полностью зависит от текущего языкового стандарта. – caf

Смежные вопросы