2013-09-08 2 views
1

Предположим, что я получаю несколько сотен строк текста в виде строки (C++) из API и посыпать этими данными немецкими умляутами, такими как ä или ö, которые необходимо заменить на ae и oe. Я знаком с кодировкой (ну, я читал http://www.joelonsoftware.com/articles/Unicode.html), и решение проблемы было тривиальным (в основном, поиск по строке, удаление символа и добавление 2 других).Как эффективно заменить немецкие умляуты на C++?

Однако, я не знаю достаточно о C++, чтобы сделать это быстро. Я только что наткнулся на StringBuilder (http://www.codeproject.com/Articles/647856/4350-Performance-Improvement-with-the-StringBuilde), что значительно улучшило скорость, но мне было любопытно, есть ли какие-нибудь лучшие или более умные способы сделать это?

+4

С utf8 это проще: ä, ö и ü двухбайтовые, как и ee oe и ue. –

+0

Btw, я задаю этот вопрос, чтобы на самом деле узнать что-то о C++ - (я многому научился из связанной статьи Stringbuilder) - мой код достаточно быстро для моих целей :-) –

+0

@BirgitP .: 'StringBuilder' бесполезен в C++ ... вам просто нужно в первую очередь использовать 'std :: string'. Реальный вопрос, однако, заключается в том, что кодировка вашей строки. Не могли бы вы указать, как буквы с умляутами и буквы с завершающим «e» представлены на уровне байтов? –

ответ

4

Если необходимо повысить эффективность работы на таком малом масштабе, рассмотреть возможность замены в два этапа:

  • Первая фаза вычисляет количество символов в итоге после замены. Пройдите по строке и добавьте 1 к счету для каждого нормального символа; для символов, таких как ä или ö, добавьте 2.
  • На данный момент у вас достаточно информации для выделения строки для результата. Сделайте строку длины, которую вы подсчитали на первом этапе.
  • Вторая фаза выполняет фактическую замену: снова перейдите к строке, скопируйте регулярные символы и замените umlauted на соответствующие пары.
+1

(Дополнительно) Это можно сделать в одном буфере. Увеличьте исходный буфер и скопируйте его с последнего на первый символ. Простой цикл, действительно. – usr2564301

2

Когда он кодируется в UTF-8, немецкие умляуты все значения два байта в Unicode, и поэтому их замена, как ae или oe. Поэтому, когда вы используете символ char [] вместо строки, вам не нужно будет перераспределять любую память и просто заменить байты при повторении символа char [].

+0

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

+1

@BirgitP. 'std :: string.c_str()' - операция с постоянным временем и возвращает указатель на внутренний буфер, используемый std :: string. Таким образом, нет никаких накладных расходов, и вам не нужно их возвращать. – Philipp

+1

Это верно, только если «unicode» здесь относится к UTF-8. Если это UTF-16, количество байтов для «ö» и «oe» отличается. Если это latin1, это снова тривиально. –