Вопрос

Я пересматриваю очень старый (10 лет) C код. Код компилизируется на UNIX/Mac с GCC и кросс-компьюками для Windows с Mingw. В настоящее время есть строки TCHAR повсюду. Я хотел бы избавиться от Tchar и вместо этого использовать строку C ++. Необходимо ли использовать функции Windows Wide, или я могу сделать все сейчас с Unicode и UTF-8?

Это было полезно?

Решение

Windows использует UTF16 все еще и, скорее всего, всегда будет. Вам нужно использовать wstring скорее, чем string следовательно. API Windows не предлагает поддержку UTF8 непосредственно, потому что Windows поддерживает Unicode до того, как был изобретен UTF8.

Таким образом, довольно больно писать код Unicode, который будет компилировать как на платформах Windows, так и на платформах UNIX.

Другие советы

Необходимо ли использовать функции Windows Wide, или я могу сделать все сейчас с Unicode и UTF-8?

Да. К сожалению, Windows не имеет собственной поддержки UTF-8. Если вам нужна надлежащая поддержка Unicode, вам нужно использовать wchar_t версия функций Windows API, а не char версия.

Должен ли я исключить tchar из кода Windows?

Да, ты должен. Причина TCHAR Существует поддержка как Unicode, так и не Unicode версии Windows. Поддержка, не являющаяся UNICODE, могла быть серьезной проблемой в 2001 году, когда Windows 98 все еще была популярна, но не сегодня.

И крайне маловероятно, что любая не специфическая для Windows библиотека будет иметь такой же char/wchar_t перегрузка, которая делает TCHAR используется.

Так что иди и заменишь все свои TCHARс wchar_tс

Код компилизируется на UNIX/Mac с GCC и кросс-компьюками для Windows с Mingw.

Мне приходилось писать кроссплатформенный код C ++ раньше. (Теперь моя работа-это написание кроссплатформенного кода C#.) Кодирование символов довольно болезненное, когда Windows не поддерживает UTF-8, а UN*X не поддерживает UTF-16. В итоге я использовал UTF-8 в качестве наше основное кодирование и преобразование по мере необходимости в Windows.

Да, в настоящее время написание приложений, не являющихся Unicode, снимается в ноге. Просто используйте широкий API везде, и вам не придется плакать об этом позже. Вы по-прежнему можете использовать UTF8 на UNIX и WCHAR_T в Windows, если вам не нужна связь (сеть) между платформами (или конвертирует WCHAR_T с API WIN32 в UTF-8), или перейти к жесткому пути и используйте UTF-8 и конвертируйте к wchar_t, когда вы используете функции Win32 API (это то, что я делаю).

Чтобы напрямую ответить на ваш вопрос:

Необходимо ли использовать функции Windows Wide, или я могу сделать все сейчас с Unicode и UTF-8?

Нет, (не ASCII) UTF-8 не принимается подавляющим большинством функций API Windows. Вы все еще должны использовать широкие API.

Можно так же оплатить, что другие OSES до сих пор не поддерживают wchar_t. Анкет Таким образом, вы также должны поддерживать UTF-8.

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

И я предсказываю, что когда-нибудь, хотя, вероятно, не до 2020 года, Windows добавит поддержку UTF-8, просто добавив U-версии всех функций API, наряду с A и W, плюс тот же тип линкера. 8-битные функции A-это всего лишь слой перевода по нативным функциям W (UTF-16). Бьюсь об заклад, они могли бы получить полуавтоматически U-слойный слой от A-слоя.

Как только их дразнили достаточно, достаточно долго, об их поддержке Юникода «20 -го века» ...

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top