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

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

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

25 ответов

55 просмотров

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

Я думаю дело в том, что буквы русские занимают 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); }

BlackBloodyRabbit Rabbit
#include <stdio.h> #include <stdlib.h> size_t mbs...

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

BlackBloodyRabbit Rabbit
#include <stdio.h> #include <stdlib.h> size_t mbs...

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

BlackBloodyRabbit Rabbit
#include <stdio.h> #include <stdlib.h> size_t mbs...

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

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

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

BlackBloodyRabbit Rabbit
#include <stdio.h> #include <stdlib.h> size_t mbs...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Всем привет, у меня есть сервер принимающий входящие HTTP подключения, как проверить, что подключение было через прокси или нет, есть какие то поля в заголовках по которым мо...
DS
8
Карта сайта