Я ищу таблицу (или способ ее генерации) для каждого символа в каждом из следующих наборов символов C:
В C99 упоминаются все шесть из них в разделе 5.2.1 . Тем не менее, я нашел его чрезвычайно загадочным для чтения и отсутствия подробностей.
Единственными наборами символов, которые он четко определяет, является набор основных символов выполнения и набор базовых исходных символов :
52 буквы верхнего и нижнего регистра в латинском алфавите:
- Как установить символ времени выполнения в C?
- Простое преобразование int в char
- c чтение символов без ASCII
- C / C ++ Почему использовать unsigned char для двоичных данных?
- кодирование c-language CMD-окон
АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ
АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ
Десять десятичных цифр:
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 наборов символов (большинство из них – псевдонимы).