2013-03-15 5 views
4

В соответствии с руководством gcc опция -fwide-exec-charset определяет широкий набор символов широких строковых и символьных констант во время компиляции.Как gcc определяет широкий набор символов при вызове `mbtowc()`?

Но каков широкий набор символов при преобразовании многобайтового символа в широкий символ, вызывая mbtowc() во время выполнения? В POSIX standard указано, что набор символов многобайтовых символов определяется категорией LC_CTYPE текущей локали, но ничего не говорит о широком наборе символов. У меня сейчас нет стандарта C, поэтому я не знаю, что говорит об этом в стандарте C.

Определяет ли параметр gcc -fwide-exec-charset широкий набор символов, используемый mbtowc(), так же, как во время компиляции?

ответ

4

Короткий ответ: набор символов, используемый для широких строк, определяется характеристиками 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».

+0

В соответствии с [c препроцессором руководства] (http://gcc.gnu.org/onlinedocs/cpp/Character-sets.html#Character-sets) препроцессор c не видит набор символов выполнения, а источник набор символов. Таким образом, '-fwide-exec-charset' не будет влиять на препроцессор. – spockwang

+0

Вы упомянули кросс-компиляцию, которая, я думаю, может быть причиной того, что существует '-fwide-exec-charset'. В последнем параграфе раздела 2.1.1 книги [«C: Справочное руководство»] (http://www.amazon.com/Reference-Manual-Samuel-P-Harbison/dp/013089592X) упоминается кросс-компиляция тоже, объясняя, что набор символов источника и исполнения может отличаться. Но все еще есть проблема: если я устанавливаю '-fwide-exec-charset', тогда набор символов выполнения большой строковой константы может отличаться от символа строки, преобразованной вызовом' mbtowc() '. Поэтому я не вижу большого смысла в этом варианте. – spockwang

+0

@wbb Это может быть иначе, только если вы укажете неправильную кодировку. Это не должно быть то, что вы настраиваете, это последнее средство для исправления несовместимости между строками, сгенерированными компилятором, и теми, которые были созданы во время выполнения libc.'-fwide-exec-charset' не требуется, если все правильно настроено (опять же, запрещая кросс-компиляцию, когда такие несоответствия часто видны). – user4815162342

 Смежные вопросы

  • Нет связанных вопросов^_^