Короткий ответ: набор символов, используемый для широких строк, определяется характеристиками wchar_t
, известных во время компиляции. Поскольку mbtowc
- это библиотечная функция, это происходит при создании libc.
mbtowc
считывает один символ из строки, закодированной во внешней кодировке, и записывает ее в значение wchar_t
, способное представлять любой символ. Аналогично, mbstowcs
преобразует внешнюю кодированную строку C в простой массив из wchar_t
. С точки зрения системы нет смысла указывать «кодировку» получающегося широкого символа/строки, потому что изменение его выходной кодировки каким-либо образом нарушит использование полученной широкой строки в виде массива wchar_t
.
Вы можете описатьmbstowcs
как производство фиксированной ширины кодировки Unicode, такие как UCS-2 или UCS-4 (или более точно UTF-16 или UTF-32), если широкие символы соответствуют ISO 10646 кодовых точек, и в зависимости от ширины wchar_t
. Вы также можете описать его как little-endian или big-endian в зависимости от вашей сущности представления процессора wchar_t
. Но это свойства платформы, которые вы не можете изменить во время выполнения больше, чем вы можете изменить endianness, или ASCII для EBCDIC.
-fwide-exec-charset
служит для явного указания компилятору кодировки, соответствующей внутреннему представлению массива-wchar_t
. Это полезно, когда оно отличается от представления, которое обычно генерирует компилятор (потому что вы перекрещиваетесь с компилятором или потому, что компилятор был неправильно сконфигурирован). Вот почему руководство продолжает предупреждать, что «у вас будут проблемы с кодировками, которые не соответствуют точно в wchar_t
».
В соответствии с [c препроцессором руководства] (http://gcc.gnu.org/onlinedocs/cpp/Character-sets.html#Character-sets) препроцессор c не видит набор символов выполнения, а источник набор символов. Таким образом, '-fwide-exec-charset' не будет влиять на препроцессор. – spockwang
Вы упомянули кросс-компиляцию, которая, я думаю, может быть причиной того, что существует '-fwide-exec-charset'. В последнем параграфе раздела 2.1.1 книги [«C: Справочное руководство»] (http://www.amazon.com/Reference-Manual-Samuel-P-Harbison/dp/013089592X) упоминается кросс-компиляция тоже, объясняя, что набор символов источника и исполнения может отличаться. Но все еще есть проблема: если я устанавливаю '-fwide-exec-charset', тогда набор символов выполнения большой строковой константы может отличаться от символа строки, преобразованной вызовом' mbtowc() '. Поэтому я не вижу большого смысла в этом варианте. – spockwang
@wbb Это может быть иначе, только если вы укажете неправильную кодировку. Это не должно быть то, что вы настраиваете, это последнее средство для исправления несовместимости между строками, сгенерированными компилятором, и теми, которые были созданы во время выполнения libc.'-fwide-exec-charset' не требуется, если все правильно настроено (опять же, запрещая кросс-компиляцию, когда такие несоответствия часто видны). – user4815162342