LINUX.ORG.RU

Во-первых char по определению не 1 байт, а столько, сколько нужно для хранения символа.
Во-вторых char не хранит utf символы, а приходится выёживаться с массивами.
Так в Си.
В более современных языках, скорее всего, char это довольно сложный тип.

Stahl ★★☆
()
Ответ на: комментарий от Stahl

Во-первых char по определению не 1 байт, а столько, сколько нужно для хранения символа.

Нет. Символы тут вообще непричём. char - это минимально адресуемая процессором единица памяти.

lenin386 ★★★★
()

Как он умудряется хранить такое?

В языке Си - через приведение типов. Строка символов хранится как массив байт (или char'ов). С массивом байт и работаешь последовательно, если хочешь UTF-8. Например, современный русский алфавит по 2 байта на символ (таблица 0x04** юникода).

pacify ★★★★★
()
Последнее исправление: pacify (всего исправлений: 1)
Ответ на: комментарий от lenin386

char - это минимально адресуемая процессором единица памяти.

https://en.wikipedia.org/wiki/C_data_types
Smallest addressable unit of the machine that can contain basic character set.
char - это минимально адресуемая процессором единица памяти, достаточная для хранения символа.

Stahl ★★☆
()

Один символ =одна или более кодовых точек. Кодовая точка = один или несколько байт(char).

atrus ★★★★★
()

Не везде char 1 байт.

FIL ★★★★
()
Ответ на: комментарий от Stahl

Значит если я включаю LC_ALL=ru_RU.utf8, то char становится размером в символ?! То ради русских буковок я трачу в два раза больше байт, ах! Однако если я включу koi8-r, то всё будет 1 байт?

coyotl
() автор топика
Ответ на: комментарий от coyotl

Нет, изменение локали в рантайме не приводит магическим образом к перекомпиляции программы. Более того, тебе ясно сказали, что "... can contain basic character set".

С другой стороны, если ты включишь UTF-8, то «русские буковки» будут попросту занимать больше одного char'а.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)

char таки байт. Есть еще Char, но это класс, а не примитив.

unt1tled ★★★★
()

char - 1 байт

И byte и char даже «теореХтически» не обязаны быть октетом.

quickquest ★★★★★
()
Ответ на: комментарий от mbivanyuk

Как это причем? Это же для совместимости с ним и сделано - он использует 2 байта для кодирования данных

r0ck3r ★★★★★
()

Никак. Один символ может состоять из нескольких code point-ов, а каждый code point может состоять из нескольких char-ов.
Поэтому для нормальной работы с юникодом нужны специальные библиотеки (или языки со встроенной поддержкой юникода).

h31 ★★★★
()
Ответ на: комментарий от r0ck3r

он использует 2 байта для кодирования данных

Я понимаю, что норки милые и забавные животные, но зачем так по ним фанатеть? utf-8 использует разное количество байт на символ, а не фиксированное.

redgremlin ★★★★★
()
Ответ на: комментарий от redgremlin

а при том, что там ограничили поддержку UTF-8 в char этой его частью:

00000000 — 0000007F 	1 байт 	        ASCII, в том числе латинский алфавит, простейшие знаки препинания и арабские цифры
00000080 — 000007FF 	2 байта 	кириллица, расширенная латиница, арабский, армянский, греческий, еврейский и коптский алфавит; сирийское письмо, тана, нко; МФА; некоторые знаки препинания
00000800 — 0000FFFF 	3 байта 	все другие современные формы письменности, в том числе грузинский алфавит, индийское, китайское, корейское и японское письмо; сложные знаки препинания; математические и другие специальные символы
00010000 — 001FFFFF 	4 байта 	музыкальные символы, смайлы, редкие китайские иероглифы, вымершие формы письменности, 00110000 — 001FFFFF не используется в Unicode
r0ck3r ★★★★★
()

Как он умудряется хранить такое?

Побайтово. Т.е. только ASCII символы занимают одну переменную. Остальные занимают больше. А вмещается оно в массивы. Массиву байт всё равно к чему какие байты относятся.

saahriktu ★★★★★
()
Ответ на: комментарий от buddhist

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

Stahl ★★☆
()
Ответ на: комментарий от Stahl

Smallest addressable unit of the machine that can contain basic character set.
char - это минимально адресуемая процессором единица памяти, достаточная для хранения символа базовой кодировки.

поправил. это кстати имхо важно, т.к. что есть basic character set это вопрос

upcFrost ★★★★★
()
Ответ на: комментарий от upcFrost

что есть basic character set это вопрос

который не имеет платформонезависимого ответа. Впрочем, ТСу такие тонкости вряд ли интересны.

Stahl ★★☆
()
Ответ на: комментарий от redgremlin

Нет, это будешь делать ты если тебе так хочется. Есть стандарт. И давай его будем придерживаться.

Stahl ★★☆
()
Ответ на: комментарий от Stahl

который не имеет платформонезависимого ответа

да тут не только платформа, тут вплоть до реализации, особенно в интерпретируемых/VM-образных языках

upcFrost ★★★★★
()
Ответ на: комментарий от upcFrost

тут вплоть до реализации

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

Stahl ★★☆
()
Ответ на: комментарий от Stahl

char в Си быстро станет 2 байтным (или сколько там получится)

Уже есть wchar_t, char16_t и char32_t, которые реализовали чтобы не ломать совместимость с классическим char. И так оно и будет дальше.

saahriktu ★★★★★
()
Ответ на: комментарий от Stahl

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

да это понятно. но если чуть отойти от С и посмотреть на понятие «тип char» в целом (ТС же спросил вообще, он язык не указывал), то становится куда веселее

скажем, судя по ответам на стеке та же нода вообще меняет размер базового char в зависимости от кодировки строки

upcFrost ★★★★★
()
Ответ на: комментарий от saahriktu

Возможно проще будет изменить текст стандарта. Но если его не изменять, то будет так, как я сказал. А для одного байта введут какой-то short char или вообще новый byte. Просто пока такой проблемы не было.

Stahl ★★☆
()
Ответ на: комментарий от upcFrost

вообще меняет размер базового char

За пределами Си я не силён, но, предполагаю, что в других языках char не базовый тип, описываемый лишь размером памяти, а целый класс. И в терминах класса всё становится удобно и прозрачно.

Stahl ★★☆
()

utf-8 это кодировка с переменной длинной символа. То есть 1 символ может на самом деле представляться в виде последовательности char длинной от 1 до 6. Программа понимает, что нужно посмотреть не только в текущий, но и в следующие несколько байтов с помощью проверки специальных битиков в первом байте. Подробнее о схеме кодирования - см. википедию.

Разумеется, это значит что 1 char никак не может уместить символ UTF-8. Имеет смысл говорить лишь о массиве char'ов.

Это если речь идёт о C, C++ и прочих языках, где char это 1 байт. В какой-нибудь Java char это 2 байта. Однако при этом уже используется кодировка UTF-16, а не UTF-8 и данный вопрос некорректен.

KivApple ★★★★★
()
Ответ на: комментарий от Stahl

А кто сказал, что «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.

saahriktu ★★★★★
()
Ответ на: комментарий от r0ck3r

Как это причем? Это же для совместимости с ним и сделано - он использует 2 байта для кодирования данных

Ну совместимость и char=utf-8 это же не одно и то же? Может там завтра для совместимости 3 или 1,5 байта сделают, вот я и спрашиваю при чем тут это?

mbivanyuk ★★★★★
()
Ответ на: комментарий от mbivanyuk

Насколько я знаю - Java именно исходит из того, что char это символ в UTF-8

r0ck3r ★★★★★
()
Ответ на: комментарий от saahriktu

А кто сказал, что «basic character set» должно относиться к чему-то ещё кроме ASCII?

А кто сказал, что «basic character set» должно относится именно к ASCII? Если бы «basic character set» относился лишь к ASCII, то почему бы сразу и не написать ASCII? Более того, если ASCII, то на кой чёрт вообще городить огород и не написать «1 байт».
Вот тебе несколько игрушек и не плачь: http://asciigames.tk/

Stahl ★★☆
()
Ответ на: комментарий от lenin386

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

utf8nowhere ★★★
()
Ответ на: комментарий от upcFrost

что есть basic character set это вопрос

Ответ:
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
_ { } [ ] # ( ) < > % : ; . ? * + - / ^ & | ∼ ! = , \ " ’

utf8nowhere ★★★
()

Как он умудряется хранить такое? Не допёр.

Не стоит вскрывать эту тему.

utf8nowhere ★★★
()
Ответ на: комментарий от utf8nowhere

ок, спасибо, не знал. но чую я что это все-таки от языка и платформы может сильно зависеть. или это некое общее определение для всех сразу?

upcFrost ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.