Intereting Posts

Где я могу найти таблицу всех символов для каждого набора символов C99?

Я ищу таблицу (или способ ее генерации) для каждого символа в каждом из следующих наборов символов C:

  • Основной набор символов
  • Набор основных символов выполнения
  • Основной набор символов источника
  • Набор символов выполнения
  • Расширенный набор символов
  • Исходный набор символов

В C99 упоминаются все шесть из них в разделе 5.2.1 . Тем не менее, я нашел его чрезвычайно загадочным для чтения и отсутствия подробностей.

Единственными наборами символов, которые он четко определяет, является набор основных символов выполнения и набор базовых исходных символов :

52 буквы верхнего и нижнего регистра в латинском алфавите:

АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ

АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ

Десять десятичных цифр:

0 1 2 3 4 5 6 7 8 9

29 графических символов:

! “#% & ‘() * +, -. /:; ? [\] ^ _ {|} ~

4 пробельных символа:

пространство, горизонтальная вкладка, вертикальная вкладка, подача формы

Я считаю, что они такие же, как и Basic Character Set , хотя я предполагаю, что C99 явно не заявляет об этом. Остальные наборы символов для меня немного загадки.

Спасибо за любую помощь, которую вы можете предложить! 🙂

За исключением базового набора символов, как вы упомянули, все остальные наборы символов определяются реализацией . Это означает, что они могут быть чем угодно, но реализация (то есть реализация компилятора / библиотек C / toolchain) должна документировать эти решения. Ключевыми пунктами здесь являются:

§3.4.1 поведение, определяемое реализацией
неопределенное поведение, когда каждая реализация документирует, как делается выбор

§3.4. Локальное поведение
поведение, которое зависит от местных конвенций национальности, культуры и языка, что каждая документация по реализации

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

Итак, посмотрите на документацию вашего компилятора C, чтобы узнать, что представляют собой другие наборы символов. Например, на моей странице man для gcc некоторые параметры командной строки:

    -fexec-кодировка = кодировка
        Установите набор символов выполнения, используемый для строки и символа
        константы.  По умолчанию используется UTF-8.  кодировкой может быть любая кодировка
        поддерживаемый библиотечной программой «iconv».

    -fwide-Exec-кодировка = кодировка
        Установите широкий набор символов, используемый для широких строк и
        символьные константы.  По умолчанию используется UTF-32 или UTF-16, в зависимости от того, что
        соответствует ширине «wchar_t».  Как и с -fexec-charset,
        charset может быть любой кодировкой, поддерживаемой системным «iconv»,
        библиотечная процедура;  однако у вас будут проблемы с кодировками
        которые не соответствуют точно в «wchar_t».

    -finput-кодировка = кодировка
        Установите входной набор символов, используемый для перевода с
        набор символов входного файла в исходный набор символов, используемый
        GCC.  Если локаль не указывается, или GCC не может получить это
        информация из локали, по умолчанию используется UTF-8.  Это может быть
        переопределяется либо параметром locale, либо этой командной строкой.
        В настоящее время опция командной строки имеет приоритет, если есть
        конфликт.  charset может быть любой кодировкой, поддерживаемой системой
        Библиотека «iconv».

Чтобы получить список кодировок, поддерживаемых iconv , запустите iconv -l . Моя система имеет 143 разных кодировки.

Насколько я вижу, стандарт не говорит о базовом наборе символов как о чем-то отличном от набора символов источника и набора символов исполнения. В стандарте указано, что есть два набора символов, на которые он связан – набор символов источника и набор символов исполнения. каждый из них имеет «базовый» и «расширенный» компонент (а расширенным компонентом может быть пустое множество).

У вас есть «набор исходных символов», который состоит из «базового набора символов источника» и ноль или более «расширенных символов». Комбинация базового набора символов источника и расширенных символов называется расширенным набором символов источника.

Аналогично для набора символов выполнения (имеется набор основных символов выполнения, который объединяется с нулевыми или более расширенными символами, составляет набор расширенных исполнительных символов).

Стандартный (и ваш вопрос) перечисляет символы, которые должны быть в базовых наборах символов – в базовом наборе могут быть другие символы.

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

Значения символов в наборах исходных символов не обязательно должны согласовываться со значениями в наборах исполнительных символов (например, набор исходных символов может состоять из ASCII, а набор символов выполнения – EBCDIC).

Вы можете посмотреть значок GNU . Среди многих других он будет печатать или преобразовывать строки Java и C99. iconv – это интерфейс командной строки для libiconv который, скорее всего, является тем, что ваш компилятор C99 использует внутри себя для этих преобразований символов.

Введите iconv -l чтобы узнать, какие строки доступны в вашей системе. Вам нужно будет перекомпилировать исходный код, чтобы изменить этот набор.

В OS X у меня есть 141 набор символов. На Ubuntu у меня есть 1 168 наборов символов (большинство из них – псевдонимы).