Перевод символа в верхний регистр c

Преобразование строки в C++ в верхний регистр

Как можно преобразовать строку в верхний регистр. Примеры, которые я нашел в googling, касаются только символов.

26 ответов

ускорение алгоритмов строку:

короткое решение с использованием C++11 и toupper().

Примечание: пара проблем с верхним решением:

21.5 утилиты последовательности с нулевым завершением

что означает cctype члены могут быть макросами, не подходящими для прямого потребления в стандарте алгоритмы.

другая проблема с тем же примером заключается в том, что он не приводит аргумент или не проверяет, что это неотрицательно; это особенно опасно для систем, где plain есть. (Причина: если это реализовано как макрос, он, вероятно, будет использовать таблицу поиска и индексы аргументов в этой таблице. Отрицательный индекс даст вам UB.)

У вас есть ASCII или международные символы в строках?

Если это последний случай, «верхний регистр» не так прост, и это зависит от используемого алфавита. Существуют двухпалатный и однопалатный алфавиты. Только двухпалатные алфавиты имеют разные символы для верхнего и нижнего регистра. Кроме того, есть составные символы, такие как Латинская заглавная буква » DZ «(\u01F1 ‘DZ’), которые используют так называемый названия. Это означает, что только первый символ (D) получает измененный.

Я предлагаю вам посмотреть на ICU и разница между простыми и полными отображениями. Это может помочь:

эта проблема vectorizable с Симд для набора символов ASCII.

ускорение сравнения:

я не тестировал с помощью RangeT другие, чем СТД::строка. может быть, другая форма to_upper_copy оптимизирует лучше, но я думаю, что это всегда будет new / malloc пространство для копии, поэтому его сложнее проверить. Возможно, что-то, что я сделал, отличается от обычного варианта использования, и, возможно, обычно остановленный g++ может поднять материал настройки локали из цикла на символ. Мой цикл чтения из std::string и писать char dstbuf[4096] имеет смысл для тестирование.

цикл вызова glibc toupper : 6.67 s (не проверял int результат для потенциального многобайтового UTF-8. Это имеет значение для турецкого.)

Автовекторизация

Gcc и clang будут автоматически векторизовать циклы только тогда, когда количество итераций известно перед циклом. (т. е. циклы поиска, такие как реализация plain-C strlen не autovectorize.)

таким образом, для строк, достаточно маленьких, чтобы поместиться в кеш, мы получаем значительное ускорение для строк

128 символов длиной от strlen первый. Это не будет необходимо для строк явной длины (например, C++ std::string ).

любой приличный libc будет иметь эффективный strlen это намного быстрее, чем цикл байта за раз, поэтому отдельные векторизованные циклы strlen и toupper быстрее.

Baseline: цикл, который проверяет окончание 0 на лету.

некоторые результаты немного отличаются от clang.

цикл microbenchmark, который вызывает функцию, находится в отдельном файле. В противном случае он подставляет и strlen() поднимается из петли, и он работает значительно быстрее, esp. для 16 строк символов (0.187 s).

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

Итак, есть большие ускорения, но автоматическая векторизация компилятора не делает отличный код, esp. для очистки последних до 15 символов.

ручная векторизация с внутреннеприсущими устройствами SSE:

обратите внимание, что добавление и вычитание 128 128 представлены то же самое для 8 чисел. Некуда нести, так что это просто xor (carryless add), переворачивая высокий бит.

учитывая эту функцию, которая работает для одного вектора, мы можем вызвать ее в цикле для обработки всей строки. Поскольку мы уже нацелены на SSE2, мы можем одновременно выполнить векторизованную проверку конца строки.

мы также можем сделать намного лучше для «очистки» последних байтов до 15, оставшихся после выполнения векторов 16B: верхний корпус idempotent, поэтому повторная обработка некоторых входных байтов в порядке. Мы делаем несогласованную нагрузку последнего 16B источника и сохраняем его в буфер dest, перекрывающий последнее хранилище 16B из цикла.

у нас есть скалярный цикл для этого, и также, чтобы получить src выровнять. Поскольку мы не знаем, где будет конечный 0, несогласованная нагрузка от src может перейти на следующую страницу и segfault. Если нам нужны байты в выровненном куске 16B, всегда безопасно загружать весь выровненный кусок 16B.

поэтому для коротких строк длиннее 16B это значительно быстрее, чем авто-векторизация. Длины одна-меньше-чем-вектор-ширина не представляет проблемы. Они могут быть проблемой при работе на месте, из-за стойла переадресации магазина. (Но обратите внимание, что по-прежнему нормально обрабатывать наш собственный выход, а не исходный вход, потому что toupper идемпотентен).

есть много возможностей для настройки этого для разных вариантов использования, в зависимости от того, что хочет окружающий код, и целевой микроархитектуры. Заставить компилятор выдавать хороший код для части очистки-это хитрый. Используя ffs(3) (который компилируется в bsf или tzcnt на x86), кажется, хорошо, но, очевидно, что бит нуждается в переосмыслении, так как я заметил ошибку после написания большей части этого ответа (см. комментарии FIXME).

векторные ускорения для еще меньших строк можно получить с помощью movq или movd нагрузки/магазинах. Настройка по мере необходимости для вашего use-case.

для текста, который UTF-8, но в основном состоит из подмножества ASCII UTF-8, это может быть хорошо: высокая производительность в общем случае с правильным поведением во всех случаях. Когда есть много не-ASCII, это, вероятно, будет хуже, чем оставаться в скалярном цикле UTF-8 все время.

сделать английский быстрее за счет других языков не является будущим доказательством решения, если недостаток является значительным.

Locale-aware:

в турецком языке ( tr_TR ), правильный результат из toupper(‘i’) is ‘İ’ (U0130), а не ‘I’ (в ASCII). См.комментарии Мартина Боннера на вопрос tolower() быть медленным на окнах.

мы также можем проверить наличие списка исключений и отката к скаляру, например, для многобайтовых входных символов UTF8.

с такой сложностью, SSE4.2 PCMPISTRM или что-то может сделать много наших проверок за один раз.

быстрая Если вы используете только символы ASCII:

обратите внимание, что этот код работать быстрее, но работает только на ASCII и не является» абстрактным » решением.

Если вам нужны решения UNICODE или более обычные и абстрактные решения, перейдите к другим ответам и работайте с методами строк C++.

Источник

Перевод текста в верхний регистр онлайн

Этот онлайн-конвертер предназначен для перевода текста на любом языке в верхний регистр. Все буквы в результате конвертирования станут заглавными, то есть «большими» (ПРИМЕР ТЕКСТА В ВЕРХНЕМ РЕГИСТРЕ). Преобразование не затрагивает знаки пунктуации, спецсимволы и цифры. Конвертирование текстов в верхний регистр одним нажатием кнопки.

За один раз рекомендуется увеличивать регистр тексту длиной не более 30 тыс. символов. Ограничение на максимальный объем текста зависит от используемого браузера. Стабильная работа конвертера с текстами большого объема не гарантируется. Можно переводить в верхний регистр только простой текст: без графики, таблиц, стилей и прочего. Обратное преобразование верхнего регистра к исходному варианту возможно здесь.

Верхний регистр символов используется в тексте в основном для визуального выделения начала предложения («с большой буквы»). Весь же текст оформляют в верхнем регистре для усиления эффекта от его восприятия, а также для привлечения внимания читающего. Подобное часто применяется в Интернете при размещении объявлений, постинга сообщений на форумах или блогах и прочее.

Как преобразовать текст в верхний регистр?

Перевести текст в верхний регистр можно с помощью специальных программ-конвертеров, текстовых редакторов или онлайн-сервисов.

В большинстве текстовых редакторов функция перевода в верхний регистр в своем непосредственном виде практически не представлена. Несмотря на востребованность этой функции, вы в большинстве случаев не найдете такой кнопки «Перевести в верхний регистр». Из того, что можно найти, это функцию автоматической установки заглавной буквы в начале предложения. А в текстовом редакторе Ворд можно создать для любого куска текста стиль его отображения с настройками «В верхнем регистре», но непосредственного преобразования текста в верхний регистр при этом не произойдет.

Если рассматривать конвертер регистра в виде отдельной программы, вы столкнетесь с различными сложностями по ее использованию. Во-первых, придется найти такую программу-конвертер для вашей операционной системы, затем установить ее и научиться ей пользоваться. Если вы используете компьютер на работе, установка программ и вовсе может быть недоступна.

Создав таким образом этот онлайн-сервис по переводу текстов в верхний регистр, мы решили эту проблему. Для использования инструмента Капс лок онлайн не потребуется ничего устанавливать и изучать, конвертер работает в любом браузере и на любом устройстве. Онлайн-перевод всех символов текста в верхний регистр можно осуществить на этой странице с помощью интернет-браузера вашего компьютера, планшета или смартфона. Вы можете сделать текст большими буквами в любое время, ведь сервис работает круглосуточно. Процесс конвертации регистра текста в верхний режим происходит всего за пару секунд. На нашем вебсайте вы можете перевести текст в верхний риестр бесплатно.

При наборе текста с клавиатуры верхний регистр символов (UpperCase) можно получить, удерживая при вводе клавишу Shift (Шифт) или включив режим Caps Lock (капслок). Обычно этот вариант включения ввода заглавных букв установлен по-умолчанию в большинстве компьютерных систем, но бывают и исключения в зависимости от локали, региональных настроек и стандартов.

Уточнение. В верхнюю касту способны переводиться не все символы. В верхний регистр не переводятся цифры, знаки пунктуации и большинство спецсимволов, оставаясь после преобразования без видимых изменений. Стоит заметить, что некоторые символы в обоих регистрах имеют одинаковое представление (полностью идентичное), поэтому может ошибочно показаться, что в верхний регистр они также не переводятся и после конвертирования остаются визуально неизменными, хотя с технической точки зрения это совершенно разные символы, имеющие различные коды. В конечном итоге все будет зависеть от состава, языка и кодировки текста, который вы собираетесь конвертировать в верхний ригистр, а также региональных настроек вашей системы (локали), операционной системы и прочего. Если в процессе перевода в верхний регистр для символов вашего текста найдутся соответствующие заглавные эквиваленты, они будут ими заменены, если нет — символы останутся без изменений. Если после конвертирования регистра часть символов стали «квадратиками», это означает что у вас в системе не установлена поддержка определенных языков (например, славянских, восточных и пр.) или отсутствуют необходимые шрифты. Устанавливать их специально не нужно, просто скопируйте и перенесите текст в исходный документ.

Не стоит злоупотреблять капсом, поскольку большой объем текста в верхнем регистре символов может вызвать у читающего неприятную реакцию. Многие сайты вообще запрещают или ограничивают использование капслока, такого текста в верхнем регистре, или, как его еще называют, кэпса. Рекомендуется увеличивать верхний регистр только небольшим участкам текста, требующим привлечения внимания.

Вот, например, распространенная ситуация, с которой сталкивались все, кто хотя бы раз набирал тексты в редакторе. Что делать, если набрал текст маленькими буквами, а нужно было большими? Теперь все переделывать, включать капс и набирать буквы заново. А если букв много, задача замены букв на большие становится весьма затратной по времени. Как перевести текст в капс автоматически? Несмотря на важность данной возможности при правке текстов, в большинстве текстовых редакторах функция преобразования регистра отсутствует или реализована так, что ей воспользоваться практически невозможно. Просто воспользуйтесь нашим онлайн-транслятором риестра и за пару секунд получите текст верхними буквами. Система в онлайн-режиме заменит все строчные буквы на заглавные.

Итак, подведем итоги. Кэпсовый конвертер (uppercase online text converter) на этой странице поможет вам увеличить регистр или размер текста в онлайн-режиме, перевести литеры нижней кассы в верхнюю. Установите тексту режим кепс лок онлайн простым нажатием кнопки, переведя все литеры текста в верхний режим. Наш апперкейс конвертор или переводчик регистров символов мгновенно выполнит в тексте замену маленьких букв на большие. Требуется поднять регистр? Хотите увеличить буквы текста? Тогда вы зашли на правильную страницу. Согласно нашей информации, функция преобразования регистров очень востребованна среди пользователей. Если в тексте уже есть прописные буквы, при использовании увеличителя регистра они останутся без изменений. Все маленькие буквы после нажатия на кнопку станут большими, то есть все строчные буквы можно заменить на прописные в автоматическом режиме.

Источник

Преобразование строки в С++ в верхний регистр

Как можно преобразовать строку в верхний регистр. Примеры, которые я нашел из googling, имеют дело только с символами.

Ускоряем строковые алгоритмы:

Краткое решение с использованием С++ 11 и toupper().

Примечание. Пара проблем с верхним решением:

21.5 Утилит последовательности с нулевым завершением

Это означает, что члены cctype вполне могут быть макросами, не подходящими для прямого потребления в стандартных алгоритмах.

Эта проблема векторизована с SIMD для набора символов ASCII.

Сравнение ускорений:

Я не тестировал использование RangeT, кроме std::string. Возможно, другая форма to_upper_copy оптимизирует лучше, но я думаю, что всегда будет new / malloc место для копии, поэтому ее сложнее тестировать. Возможно, что-то, что я сделал, отличается от обычного варианта использования, и, возможно, обычно остановленный g++ может вывести настройки локали из цикла для каждого символа. Мой цикл чтения из std::string и записи в char dstbuf[4096] имеет смысл для тестирования.

цикл, вызывающий glibc toupper : 6,67 с (однако не проверяет результат int для потенциального многобайтового UTF-8. Это важно для турецкого языка.)

Автовекторизация

Gcc и clang будут автоматически векторизовывать циклы только тогда, когда число итераций известно перед циклом. (то есть поисковые циклы, такие как реализация strlen на обычном C, не будут автоматически векторизованы.)

Таким образом, для строк, достаточно маленьких для размещения в кеше, мы получаем значительное ускорение для строк длиной

Любой приличный libc будет иметь эффективный strlen намного быстрее, чем зацикливание байта за раз, поэтому отдельные векторизованные циклы strlen и toupper работают быстрее.

Базовая линия: цикл, который проверяет завершающий 0 на лету.

Некоторые результаты немного отличаются от Clang.

Цикл микробенчмарка, который вызывает функцию, находится в отдельном файле. В противном случае он встроен, и strlen() выводится из цикла, и он работает значительно быстрее, особенно для 16 строк символов (0,187 с).

Это имеет основное преимущество, заключающееся в том, что gcc может автоматически векторизовать его для любой архитектуры, но главный недостаток в том, что он медленнее для обычно распространенного случая небольших строк.

Так что есть большие ускорения, но автоматическая векторизация компилятора не делает отличный код, особенно. для очистки последних до 15 символов.

Ручная векторизация с использованием встроенных функций SSE:

Учитывая эту функцию, которая работает для одного вектора, мы можем вызвать ее в цикле для обработки всей строки. Поскольку мы уже нацелены на SSE2, мы можем одновременно выполнять векторизованную проверку конца строки.

Мы также можем сделать намного лучше для «очистки» последних до 15 байтов, оставшихся после выполнения векторов 16B: верхний регистр идемпотентен, поэтому повторная обработка некоторых входных байтов в порядке. Мы делаем невыровненную загрузку последних 16B источника и сохраняем ее в буфере dest, перекрывающем последнее 16B хранилище из цикла.

Единственный раз, когда это не работает, это когда вся строка меньше 16B: даже когда dst=src неатомарное чтение-изменение-запись это не то же самое, что совсем не трогать некоторые байты, и может нарушать многопоточный код.

Таким образом, для коротких строк длиннее 16В это значительно быстрее, чем векторизация. Длина на единицу меньше ширины вектора не представляет проблемы. Они могут быть проблемой при работе на месте из-за остановки магазина. (Но учтите, что обрабатывать наш собственный вывод все же хорошо, а не исходный ввод, потому что toupper является идемпотентом).

Существует много возможностей для настройки этого для различных вариантов использования, в зависимости от того, что хочет окружающий код, и целевой микроархитектуры. Заставить компилятор выдавать хороший код для части очистки довольно сложно. Использование ffs(3) (которое компилируется в bsf или tzcnt на x86) кажется хорошим, но очевидно, что этот бит нуждается в переосмыслении, так как я заметил ошибку после написания большей части этого ответа (см. комментарии FIXME).

Для текста, который UTF-8, но в основном состоит из подмножества ASCII UTF-8, это может быть хорошо: высокая производительность в общем случае с корректным поведением во всех случаях. Однако, когда в нем много не ASCII, это, вероятно, будет хуже, чем постоянное пребывание в скалярном цикле с поддержкой UTF-8.

Ускорение английского за счет других языков не является решением на будущее, если недостаток существенный.

Локали известно:

Мы также можем проверить список исключений и откат к скаляру, например, для многобайтовых символов ввода UTF8.

С такой большой сложностью SSE4.2 PCMPISTRM или что-то может сделать много наших проверок за один раз.

Источник

Оцените статью
( Пока оценок нет )
Поделиться с друзьями
Uchenik.top - научные работы и подготовка
0 0 голоса
Article Rating
Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии