Во-первых char по определению не 1 байт, а столько, сколько нужно для хранения символа. Во-вторых char не хранит utf символы, а приходится выёживаться с массивами. Так в Си. В более современных языках, скорее всего, char это довольно сложный тип.
В языке Си - через приведение типов. Строка символов хранится как массив байт (или char'ов). С массивом байт и работаешь последовательно, если хочешь UTF-8. Например, современный русский алфавит по 2 байта на символ (таблица 0x04** юникода).
char - это минимально адресуемая процессором единица памяти.
https://en.wikipedia.org/wiki/C_data_types Smallest addressable unit of the machine that can contain basic character set. char - это минимально адресуемая процессором единица памяти, достаточная для хранения символа.
Значит если я включаю LC_ALL=ru_RU.utf8, то char становится размером в символ?! То ради русских буковок я трачу в два раза больше байт, ах! Однако если я включу koi8-r, то всё будет 1 байт?
Нет, изменение локали в рантайме не приводит магическим образом к перекомпиляции программы. Более того, тебе ясно сказали, что "... can contain basic character set".
С другой стороны, если ты включишь UTF-8, то «русские буковки» будут попросту занимать больше одного char'а.
Никак. Один символ может состоять из нескольких code point-ов, а каждый code point может состоять из нескольких char-ов. Поэтому для нормальной работы с юникодом нужны специальные библиотеки (или языки со встроенной поддержкой юникода).
а при том, что там ограничили поддержку UTF-8 в char этой его частью:
00000000 — 0000007F 1 байт ASCII, в том числе латинский алфавит, простейшие знаки препинания и арабские цифры
00000080 — 000007FF 2 байта кириллица, расширенная латиница, арабский, армянский, греческий, еврейский и коптский алфавит; сирийское письмо, тана, нко; МФА; некоторые знаки препинания
00000800 — 0000FFFF 3 байта все другие современные формы письменности, в том числе грузинский алфавит, индийское, китайское, корейское и японское письмо; сложные знаки препинания; математические и другие специальные символы
00010000 — 001FFFFF 4 байта музыкальные символы, смайлы, редкие китайские иероглифы, вымершие формы письменности, 00110000 — 001FFFFF не используется в Unicode
Побайтово. Т.е. только ASCII символы занимают одну переменную. Остальные занимают больше. А вмещается оно в массивы. Массиву байт всё равно к чему какие байты относятся.
Не, не относятся. Но если завтра саакрихту и Эдди-М сыграют в ящик, захватив с собой однобайтные кодировки, то char в Си быстро станет 2 байтным (или сколько там получится)
Smallest addressable unit of the machine that can contain basic character set. char - это минимально адресуемая процессором единица памяти, достаточная для хранения символа базовой кодировки.
поправил. это кстати имхо важно, т.к. что есть basic character set это вопрос
Разумеется, но ведь компиляторы Си на каждой платформе (как аппаратной, так и программной) разные и учитывают особенности этой платформы
да это понятно. но если чуть отойти от С и посмотреть на понятие «тип char» в целом (ТС же спросил вообще, он язык не указывал), то становится куда веселее
скажем, судя по ответам на стеке та же нода вообще меняет размер базового char в зависимости от кодировки строки
Возможно проще будет изменить текст стандарта. Но если его не изменять, то будет так, как я сказал. А для одного байта введут какой-то short char или вообще новый byte. Просто пока такой проблемы не было.
За пределами Си я не силён, но, предполагаю, что в других языках char не базовый тип, описываемый лишь размером памяти, а целый класс. И в терминах класса всё становится удобно и прозрачно.
utf-8 это кодировка с переменной длинной символа. То есть 1 символ может на самом деле представляться в виде последовательности char длинной от 1 до 6. Программа понимает, что нужно посмотреть не только в текущий, но и в следующие несколько байтов с помощью проверки специальных битиков в первом байте. Подробнее о схеме кодирования - см. википедию.
Разумеется, это значит что 1 char никак не может уместить символ UTF-8. Имеет смысл говорить лишь о массиве char'ов.
Это если речь идёт о C, C++ и прочих языках, где char это 1 байт. В какой-нибудь Java char это 2 байта. Однако при этом уже используется кодировка UTF-16, а не UTF-8 и данный вопрос некорректен.
А кто сказал, что «basic character set» должно относиться к чему-то ещё кроме ASCII? Всё-таки, юникод совсем не «basic character set», а скорее «universal character set». И не мне ли тут много раз говорили, что UTF-8 будет жить ещё многие десятилетия? А пока жив UTF-8 «Smallest addressable unit of the machine», который может содержать «basic character set» - это один байт. Вот когда и UTF-8 совсем помрёт, а в ходу из этих UTF-8/UTF-16/UTF-32 останутся только UTF-16 и UTF-32 - вот тогда и можно будет говорить о ресайзе типа char.
А кто сказал, что «basic character set» должно относиться к чему-то ещё кроме ASCII?
А кто сказал, что «basic character set» должно относится именно к ASCII? Если бы «basic character set» относился лишь к ASCII, то почему бы сразу и не написать ASCII? Более того, если ASCII, то на кой чёрт вообще городить огород и не написать «1 байт». Вот тебе несколько игрушек и не плачь: http://asciigames.tk/
The fundamental storage unit in the C ++ memory model is the byte. A byte is at least large enough to contain
any member of the basic execution character set (2.3) and the eight-bit code units of the Unicode UTF-8
encoding form
Ответ:
The basic source character set consists of 96 characters: the space character, the control characters repre-
senting horizontal tab, vertical tab, form feed, and new-line, plus the following 91 graphical characters:
a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9
_ { } [ ] # ( ) < > % : ; . ? * + - / ^ & | ∼ ! = , \ " ’