LINUX.ORG.RU

C: printf для multibyte-строк


0

0

Подскажите, как увязать printf и multibyte string (в кодировке локали)? Например, printf("%-30sabc", locale_encoded_string) в UTF-8 локали совсем не по символам выравнивает строку, а по байтам. Есть ли printf для таких случаев или нужно это делать двойным перекодированием mbstowcs->swprintf->wcstombs->printf?

★★★

Лучше приведи пример кода, который у тебя не работает.

Потому что следующий пример работает как надо:

==={{{
$ vim -c "e ++enc=utf-8 1.c"
#include <stdio.h>

int
main()
{
        printf("%-30sabc", "Проверка");
        return 0;
}

$ hexdump -C 1.c
00000000  23 69 6e 63 6c 75 64 65  20 3c 73 74 64 69 6f 2e  |#include <stdio.|
00000010  68 3e 0a 0a 69 6e 74 0a  6d 61 69 6e 28 29 0a 7b  |h>..int.main().{|
00000020  0a 09 70 72 69 6e 74 66  28 22 25 2d 33 30 73 61  |..printf("%-30sa|
00000030  62 63 22 2c 20 22 d0 9f  d1 80 d0 be d0 b2 d0 b5  |bc", "п÷я─п╬п╡п╣|
00000040  d1 80 d0 ba d0 b0 22 29  3b 0a 09 72 65 74 75 72  |я─п╨п╟");..retur|
00000050  6e 20 30 3b 0a 7d 0a 0a                           |n 0;.}..|
00000058

$ cc 1.c -W -Wall -pedantic -std=c99 -o 1

$ LANG=ru_RU.UTF-8 ./1
Проверка              abc

===}}}

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

> Проверка abc

Щетовод, посчитай, сколько там символов до "abc" -- в сумме всего получается 22. Как раз 8 символов на UTF-8 переключающие символы ("п") остается. ;)

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

> wprintf

Bingo! Я сначала тоже такой способ попробовал, но не догадался сначала локаль инициализировать (setlocale(LC_ALL, "")) -- в результате вывод был неправильный. Вопрос исчерпан, всем спасибо :)

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