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

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

  • Базовый набор символов
  • Базовый набор символов исполнения
  • Базовый исходный набор символов
  • Набор символов исполнения
  • Расширенный набор символов
  • Исходный набор символов

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

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

52 заглавных и строчных букв в латинский алфавит:

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

a b c d e f g h i j klm n o p q r s t u v w x y z

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

0 1 2 3 4 5 6 7 8 9

29 графических знаков:

! "#% & '() * +, -. /:; <=>? [\] ^ _ {|} ~

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 11 октября 2010

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

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

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

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

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

   -fexec-charset=charset
       Set the execution character set, used for string and character
       constants.  The default is UTF-8.  charset can be any encoding
       supported by the system's "iconv" library routine.

   -fwide-exec-charset=charset
       Set the wide execution character set, used for wide string and
       character constants.  The default is UTF-32 or UTF-16, whichever
       corresponds to the width of "wchar_t".  As with -fexec-charset,
       charset can be any encoding supported by the system's "iconv"
       library routine; however, you will have problems with encodings
       that do not fit exactly in "wchar_t".

   -finput-charset=charset
       Set the input character set, used for translation from the
       character set of the input file to the source character set used by
       GCC.  If the locale does not specify, or GCC cannot get this
       information from the locale, the default is UTF-8.  This can be
       overridden by either the locale or this command line option.
       Currently the command line option takes precedence if there's a
       conflict.  charset can be any encoding supported by the system's
       "iconv" library routine.

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

2 голосов
/ 11 октября 2010

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

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

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

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

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

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

1 голос
/ 11 октября 2010

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

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

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

...