C locale - это локаль, отрицающая жизнь за мкадом существование других языков и народов, кроме американского: все символы лежат в пределах 7-битного ASCII.
С появлением интернета американцы всё-таки узнали, что на этой планете живут ещё какие-то ушлёпки, которые пишут непонятные буквы, но к тому времени язык Си уже был написан, POSIX стандартизирован, и вообще поздняк метаться и негоже традиции нарушать.
вы что-то путаете
локаль не занимается вопросами кодировки текста
локаль определяет, например, как перевести символ из строчного в прописной, как отсортировать строки по алфавиту, какой символ будет десятичной точкой (не угадаете какой - получите ошибку при переводе строки в число, лол)
кодировка - это свойство объекта, а не локали. любой объект, хранящий внутри себя текст, сам определяет, в какой кодировке он его хранит.
оффтопик - это хороший пример ОС, в которой вопросы локали и кодировки задизайнены наиболее правильно. например, локаль у ОС - русская. а кодировки - в разных местах разные: когда вы вызываете функцию открытия файла, то имя файла должно быть в 1251, когда вы выводите текст в консоль, то 866, файловая система хранит внутри себя имена файлов в UTF16, а текстовый редактор прекрасно работает с файлами в UTF32 (он видит кодировку из BOM), и всё это работает одновременно, под одной локалью!
но линуксоидам не всегда бывает очевидно, что кодировка - атрибут объекта. это всё потому, что линукс - как студент на экономном пайке: одна картошка, одна котлета, один язык программирования и одна кодировка, и не видно перспектив на лучшую жизнь. правда, благодаря перлу в линуксе всё-таки появился ЯП №2, а в последние годы и вовсе стало получше с языками, но насчёт кодировок линукс всё ещё «в танке»: кодировка должна быть одна.
запись C.UTF-8 объединяет два разных параметра (локаль и кодировку) в один. вероятно, так сделали затем, чтобы подчеркнуть зависимость второго параметра от первого (локаль определяет, из каких значений может быть выбрана кодировка)
в локали C нет никаких правил насчёт символов за пределами ASCII7, какая бы кодировка не была выбрана.
Никуда оно не слиплось. Просто такое соглашение, чтобы как-то различать локали, рассчитанные на разные кодировки. Технически название локали это литерал, он никакой структуры не имеет.
кодировку туда зачем-то приляпали только в юниксах
Кодировку учитывать необходимо, потому что в разных кодировках будет разный порядок сортировки и байтики которые обозначают дни недели, месяцы и т.д.
Да, конечно необходимо, если хочешь работать с текстом
А никто и не говорил, что локаль - это всё что потребуется
Локаль смотрит на текст как на набор СИМВОЛОВ, а не байтов
Переводом символов в байты занимается другой компонент - кодировка
И для работы с текстом нужны оба этих компонента
Вроде бы локаль Си, это где точка отделяет целую часть числа от дробной. А не как у нас в Германии и в остальных нормальных странах (включая даже Хохлэнд, который на нас ровняется) – православная запятая.
ну как же, это единственная локаль с которой линукс будет нормально работать.
*** WARNING *** The locale specified by the environment affects sort order. Set LC_ALL=C to get the traditional sort order that uses native byte values.
а кодировки - в разных местах разные: когда вы вызываете функцию открытия файла, то имя файла должно быть в 1251, когда вы выводите текст в консоль, то 866, файловая система хранит внутри себя имена файлов в UTF16, а текстовый редактор прекрасно работает с файлами в UTF32 (он видит кодировку из BOM), и всё это работает одновременно, под одной локалью!
А пистолет то, пистолет пользователям этой замечательной феерии шизоидного бреда выдают??? Иначе как им себя от этого избавить?
А пистолет то, пистолет пользователям этой замечательной феерии шизоидного бреда выдают??? Иначе как им себя от этого избавить?
лицам с неустойчивой психикой, теряющим рассудок от взгляда на многообразие возможностей винды, пистолет не выдают
вместо этого им выдают линукс, где кодировка только одна, и поэтому пациентам так спокойнее
но спокойнее - не значит проще )))
недавно я поинтересовался, как в линуксе сделать глобальный именованный мьютекс, чтобы два процесса могли разграничить доступ к общему ресурсу, если оба знают имя мьютекса
в винде для этого всего три функции: CreateMutex, WaitForSingleObject, ReleaseMutex, всё просто и естественно.
в линуксе без слёз не взглянешь: функции работы с мьютексами не могут открыть мьютекс по имени (позор!), для координирования работ всем заинтересованным сторонам нужно иметь ссылку на один и тот же мьютексный объект в памяти. это легко сделать для нескольких ветвей внутри одного процесса, но как это сделать из двух разных процессов (т.к. у них разные адресные пространства)?
бедолагам рекомендуют доставать гланды через жопу: они по общему имени открывают шареную память, размещают там мьютексный объект, созданный со специальными атрибутами, и уже на этот общий объект дают ссылку при вызове мьютексных функций, итого получается 11 функций: shm_open, ftruncate, mmap, pthread_mutexattr_init, pthread_mutexattr_setpshared, pthread_mutex_init, pthread_mutexattr_destroy, pthread_mutex_lock, pthread_mutex_unlock, pthread_mutex_destroy, shm_unlink.
иногда мне кажется, что линукс дизайнил человек, ненавидящий программистов.
и теперь я хочу спросить, где выдают пистолет для линуксоидов?
как в линуксе сделать глобальный именованный мьютекс, чтобы два процесса могли разграничить доступ к общему ресурсу, если оба знают имя мьютекса
Это похоже на некорректную постановку задачи - в условии задачи уже содержится неоптимальное для одной из систем решение (сделать глобальный именованный мьютекс).
Для начала надо убрать из условия навязанное решение, и ответить на вопрос - как в linux оптимальнее решить задачу «разграничить доступ к общему ресурсу».