Кроссплатформенная обработка текста в C / C ++ - PullRequest
2 голосов
/ 16 апреля 2009

Какова текущая лучшая практика для обработки общего текста независимым от платформы способом?

Например, в Windows есть версии API "A" и "W". На уровне C у нас есть функции "_tcs" (например, _tcscpy), которые отображаются на "wcscpy" или "strcpy". И в STL я часто использовал что-то вроде:

typedef std::basic_string<TCHAR> tstring;

Какие проблемы возникают, если таковые возникают из-за таких шаблонов в других системах?

Ответы [ 3 ]

2 голосов
/ 16 апреля 2009

В стандарте C ++ отсутствует поддержка универсального (переменной ширины) символа, такого как TCHAR. C ++ имеет wchar_t, но кодировка не гарантируется. C ++ 1x значительно улучшит ситуацию, когда у нас будут char16_t и char32_t, а также литералы UTF- {8,16,32}.

Лично я не большой поклонник общих символов, потому что они приводят к некоторым неприятным проблемам (например, преобразованию) и, более того, если вы используете тип (например, TCHAR), максимальная ширина которого может быть 8 Вы можете также кодировать с char. Если вам действительно нужна обратная совместимость, просто используйте UTF-8; он специально разработан для строгого надмножества ASCII. Возможно, вам придется использовать API преобразования (особенно в Windows, которая по какой-то странной причине является UTF-16), но, по крайней мере, она будет согласованной.

РЕДАКТИРОВАТЬ: Чтобы фактически ответить на первоначальный вопрос, другие платформы, как правило, не имеют такой конструкции. Вам придется определить свой TCHAR на этой платформе или использовать библиотеку, которая ее предоставляет (но, как вы, несомненно, сможете догадаться, я не большой поклонник этой концепции в библиотеках).

1 голос
/ 16 апреля 2009

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

Обычно я создаю свои собственные t типы на основе типов stl. tstring, tstringstream и даже вниз для повышения типов, таких как tpath_t.

0 голосов
/ 16 апреля 2009

Набор символов Unicode + кодировка, наиболее подходящая для ваших данных. Обычно я использую UTF-8, потому что это удобно с традиционными функциями C / C ++, и данные, с которыми я имею дело, не вызывают слишком большого раздувания.

Некоторые API (Windows) и кросс-языковые инструменты (Java) используют UTF-16, так что это может быть вопросом.

Одна из практик, которую я хотел бы сделать лучше, - это оставлять текст в виде байтов массива для выполнения низкотехнологичных операций, таких как копирование, простое сравнение, простой поиск и т. Д. Когда вам нужны более богатые и более знаковые операции, вы можете преобразовать их в некоторые. суперстрока ( icu strings хорошая - но тяжелая) и определяет слои / точки входа, которые нуждаются в , чтобы сделать это, а не наивно делать это везде. Бесполезные разговоры убивают нашу производительность - особенно в сочетании с библиотекой XML DOM, которая также использует «супер» строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...