wcstombs: кодировка символов? - PullRequest
       34

wcstombs: кодировка символов?

3 голосов
/ 03 февраля 2010

wcstombs документация говорит, что она "преобразует последовательность кодов широких символов в многобайтовую строку". Но это никогда не говорит о том, что такое «широкий характер».

Является ли он неявным, например, он преобразует utf-16 в utf-8 или преобразование определяется некоторой переменной среды?

Также, каков типичный случай использования wcstombs?

Ответы [ 4 ]

4 голосов
/ 03 февраля 2010

Вы используете стандартную функцию setlocale() с категорией LC_CTYPE (или LC_ALL), чтобы установить отображение, которое библиотека использует между wchar_t символами и многобайтовыми символами.Фактическое имя локали, переданное setlocale(), определяется реализацией, поэтому вам нужно будет найти его в документации вашего компилятора.

Например, в MSVC вы можете использовать

setlocale( LC_ALL, ".1252" );

установить для среды выполнения C использование кодовой страницы 1252 в качестве многобайтового набора символов.Обратите внимание, что документы MSVC явно указывают, что языковой стандарт не может быть установлен в UTF-7 или UTF8 для многобайтовых наборов символов:

Набор доступных языков, кодов стран / регионов и кодовых страниц включает все этиподдерживается WinLS NLS API, за исключением кодовых страниц, для которых требуется более двух байтов на символ, таких как UTF-7 и UTF-8.Если вы предоставите кодовую страницу, такую ​​как UTF-7 или UTF-8, setlocale завершится с ошибкой и вернет NULL.

«Широкий символ» wchar_t тип предназначен для поддержки любого символаустановить поддержку системы - стандарт не определяет размер типа wchar_t (он может быть как char или любой из целочисленных типов большего размера).В Windows это «внутренняя» кодировка Unicode системы, то есть UTF-16 (UCS-2 до WinXP).Честно говоря, я не могу найти прямую цитату об этом в документах MSVC, хотя.Строго говоря, реализация должна вызывать это, но я не могу найти это.

3 голосов
/ 03 февраля 2010

Он преобразует все, что ваша платформа использует для "широкого символа" (который, как я полагаю, действительно является UCS2 в Windows, но обычно UCS4 в UNIX) в многобайтовую кодировку по умолчанию в текущей локали. Если ваша локаль UTF-8, то будет использоваться многобайтовая кодировка, но обратите внимание, что есть и другие возможности, такие как JIS.

1 голос
/ 03 февраля 2010

Согласно стандарту C, тип wchar_t «способен представлять любой символ в текущей локали». Стандарт не говорит, что такое кодировка для wchar_t. Фактически, ограничения на WCHAR_MIN и WCHAR_MAX составляют [0, 255] или [-127, 127], в зависимости от того, является ли wchar_t без знака или со знаком.

Многобайтовый символ может использовать более одного байта. Многобайтовая строка состоит из одного или нескольких многобайтовых символов. В многобайтовой строке каждый символ не обязательно должен иметь одинаковое количество байтов (например, UTF-8). Принимая во внимание, что объект типа wchar_t имеет фиксированный размер (в данной реализации, конечно).

Кроме того, я также могу найти следующее в своей копии черновика C99:

__STDC_ISO_10646__ Целочисленная константа вида yyyymmL (например, 199712L). Если этот символ определен, то каждый символ в требуемом наборе Unicode при хранении в объекте типа wchar_t имеет то же значение, что и короткий идентификатор этого символа. Требуемый набор Unicode состоит из всех символов, определенных ISO / IEC 10646, а также всех поправок и технических исправлений на указанный год и месяц.

Итак, если я правильно понял, если определено __STDC_ISO_10646__, то wchar_t может хранить символы Unicode.

1 голос
/ 03 февраля 2010

Строки широких символов состоят из многобайтовых символов, тогда как обычная строка C представляет собой символ * - последовательность символов шириной в байт. Wchars - это не то же самое, что Unicode на всех платформах, хотя Unicode-представления обычно основаны на wchar_t

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

Обычно используется преобразование двухбайтовой строки в обычную строку C, и наоборот

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