Подтвердить что ты не робот

Tchar.h на linux

Я пытаюсь написать кросс-платформенный код i18n С++. Поскольку большинство Linux-систем предпочитают использовать UTF-8 в качестве кодировки символов, я думал, что я должен использовать строку в linux и wstring для Windows. Доступен ли tchar.h на linux? Что такое эквивалентная замена для tchar.h на Linux?

4b9b3361

Ответ 1

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

Подведение итогов статьи:

При компиляции этого кода с компилятором GNU C TCHAR будет транслироваться в широкий тип символьных данных (большинство переносимых библиотек определяют TCHAR в своих заголовках и ссылаются на wchar_t). Фактически, это было то, как я превратил свою программу на С++ в генератор анаграмм: я использовал стандартные строки С++, заполненные UTF-8, и загружал данные с помощью указателей, переданных в wchar_t, в библиотечные функции. Данные UTF-8, интерпретируемые как UTF-32, равны мусору (но это чрезвычайно полезно для обфускации данных и ошибок).

Ответ 2

На самом деле это не так просто. string.size() даст вам количество байтов UTF-8, а не символов Unicode. Справедливости ради, wstring.size() не даст вам количество символов либо в присутствии суррогатов. Но на практике они не используются в обычных приложениях.

Итак, реальный ответ действительно зависит от того, зачем нужны строки Unicode. Это просто локализация пользовательского интерфейса? У вас есть пользовательский ввод? Вам нужно разобрать этот ввод?

Ответ 3

Для создания моего централизованного источника Windows я смог использовать файл tchar.h из Cygwin, найденный в папке cygwin\usr\include\w32api.

Я использую Android NDK. Для моих целей я сделал копию tchar.h и исправил ее.

//#include <crtdefs.h>

#define _CRTIMP

//#define _strninc(_pc,_sz) (((_pc)+(_sz)))
//  _CRTIMP size_t __cdecl __strncnt(const char *_Str,size_t _Cnt);

Ответ 4

обратитесь к nsis_tchar.h из NSIS. Это показывает, как умный код UNICODE/ANSI изменяется вкратце.

nsis_tchar.h не предназначен для Linux. вы должны изменить какое-то определение, например

#ifdef _WINDOWS
#define _tcsicmp    _stricmp     //original nsis_tchar.h
#define _tcsncicmp  _strnicmp
#define _tcsnicmp   _strnicmp
#else
#define _tcsicmp    _strcasecmp  //added for linux
#define _tcsncicmp  _strncasecmp
#define _tcsnicmp   _strncasecmp
#endif