169 похожих чатов

Привет. Все было хорошо когда были латинские буквы которые занимают

один байт памяти. При выводе строк использовал спецификатор %28s и тд. Все слова были аккуратно выровнены по правому краю до того момента как я захотел их сделать по русски то есть кириллицей, буквы которой занимают уже два байта. Ну думал что поменяв цифры в спецификаторе смогу исправить новое положение слов точно по правому краю. А нет.... Как бы я не старался либо буквы пропадают (в случае с заданием минимального и максимального количества символов слова типа %21.8s) или же вовсе сдвигаются далеко вправо самые короткие слова а самые длинные где-то посередине стоят. Помогите пожалуйста разобраться с кириллицей?))

25 ответов

64 просмотра

Или си не говорит по русски?)))

Я думаю дело в том, что буквы русские занимают 2 байта, а пробелы все еще 1, так что просто в 2 раза увеличить не получится

Василий Александрович
Или си не говорит по русски?)))

Тут вариант написать свою реализацию притфа

Василий Александрович
Ну я так и описал проблему

Надо либо самому писать, либо найти для этого либу, думаю уже ктото таким занимался. И не именно для русского искать, а для юникода

Daniil Miskevich
Тут вариант написать свою реализацию притфа

Видел где-то как делали это но уже не могу найти больше, может есть ссылка?))

#include <stdio.h> #include <stdlib.h> size_t mbslen(const char *str) { size_t len = strlen(str); size_t mb_len = 0; for (size_t offset = 0; offset < len; mb_len++, offset += mblen(str + offset, len - offset)); return mb_len; } #define SWIDTH(W, STR) (int)(strlen(STR) - mbslen(STR) + W) int main() { const char str1[] = "Hello world!"; const char str2[] = "Привет мир!"; printf("%*s\n", SWIDTH(30, str1), str1); printf("%*s\n", SWIDTH(30, str2), str2); }

Денис Rabbit
#include <stdio.h> #include <stdlib.h> size_t mbs...

Попробую разобраться и сделать. Спасибо.

Денис Rabbit
#include <stdio.h> #include <stdlib.h> size_t mbs...

А как кстати mblen определяет длину внутри? Мы же кодировку не передаем

Денис Rabbit
#include <stdio.h> #include <stdlib.h> size_t mbs...

Мне попадался этот вариант уже где-то в интернете... Ток я так и не понял его)) но теперь раз это поможет то я обязательно возьму на заметку и попытаюсь сделать

Vladimir
А как кстати mblen определяет длину внутри? Мы же ...

Оно старшие биты в каждом байте смотрит, можно было б и ручками написать, но лень, раз есть стандартное решение.

Денис Rabbit
#include <stdio.h> #include <stdlib.h> size_t mbs...

Его же можно как собственный заголовок подключить или лучше как функцию добавить для компилятора?

Василий Александрович
Мне попадался этот вариант уже где-то в интернете....

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

Денис Rabbit
Оно старшие биты в каждом байте смотрит, можно был...

Типа приходит ему строка в виде байтов ABCD. Как он понимает, что AB - это первая буква, а CD - вторая буква, а не например A - первая буква, BC - вторая буква, D - третья буква? Или ABCD это 1 китайская буква

Vladimir
Не понял, если честно

Есть аски, в ней старший бит 0, следовательно mblen сразу определит количество байт 1, есть utf-8, там 0/110/1110, следовательно он понимает, что перед ним utf-8 и надо проверить оставшиеся байты на ожидаемый формат.

Денис Rabbit
Есть аски, в ней старший бит 0, следовательно mble...

Разве можно по старшему биту однозначно определить верную кодировку? Их же много бывает разных. Не понятно как-то. Мне кажется что таким образом точно можно сказать только, ascii это или нет

Vladimir
Разве можно по старшему биту однозначно определить...

Так нет, конечно он не все кодировки рассматривает, я думал у тебя вопрос, как он определяет аски от юникода А текущая мультибайтовая кодировка указывается в локали, там магии нет.

Денис Rabbit
Так нет, конечно он не все кодировки рассматривает...

Осталось понадеяться что исходный код программы будет сохранен в кодировке, которая есть в системе, и что локаль установлена верно?)

Vladimir
Осталось понадеяться что исходный код программы бу...

Не, в примере который я написал выше нужно понадеяться, что это будет именно utf-8, т.к. для utf-16 или utf-32 нельзя стрлен юзать) А в целом да, верно, кодировка исходника должна соответствовать локали.

Денис Rabbit
Не, в примере который я написал выше нужно понадея...

Поэтому я бы наверное если такая задача возникла, делал бы через gettext

Денис Rabbit
Не, в примере который я написал выше нужно понадея...

Что на самом деле оправдано, т.к. для utf-16 и utf-32 такая проблема в принципе возникнуть не может.

Денис Rabbit
Что на самом деле оправдано, т.к. для utf-16 и utf...

*ucs2, т.к. для utf-16 гипотетически может, т.к. там суррогатные пары есть.

Денис Rabbit
*ucs2, т.к. для utf-16 гипотетически может, т.к. т...

А если в тексте еще и BOM есть? Отбросит?

Vladimir
А если в тексте еще и BOM есть? Отбросит?

Так Бом он исключительно для тебя, чтобы ты понял, с каким файлом работаешь, его ручками обрабатывать надо

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта