Windows-версия wcswidth_l - PullRequest
       13

Windows-версия wcswidth_l

3 голосов
/ 28 марта 2012

У меня есть текст для записи в консоль Windows, который мне нужен, чтобы узнать реальную ширину в столбцах.wcswidth_l, кажется, лучший вариант на платформах, которые его имеют (хотя mbswidth_l() было бы лучше, так как у меня нет желания использовать wchar_t, но по какой-то причине его не существует).Но помимо других платформ мне нужно что-то, что работает на Windows.Хотя маловероятно, что есть портативное решение, я вообще не знаю ни одного решения для Windows.Я думаю, что консоль имеет API для получения позиции курсора и тому подобное, поэтому я мог бы написать текст и проверить изменение позиции.Полагаю, это было бы точно, но выписывание дополнительных выходных данных вообще неприемлемо.

Как можно получить ширину столбца строки или символа в Windows?

Редактировать:

wcswidth_l возвращает количество консольных столбцов, используемых для отображения строки.Некоторые символы занимают один столбец, а другие, например японские символы, занимают два.

Например, «ширина столбца» для «a あ» равна четырем.«а» один, «один» и «one» два.(Предполагается, что консоль настроена на фактическое отображение символов, отличных от ascii).Также было бы неплохо, если бы API поддерживал строки с использованием кодовой страницы 65001 (UTF-8).

Ответы [ 2 ]

0 голосов
/ 02 ноября 2014

Портативный подход

Поскольку ширина символов зависит больше от самих символов, а не от системы, в которой они отображаются (хорошо, могут быть исключения, но они должны быть довольно редкими), для этого можно использовать отдельную функцию (также в Windows) , Для этого требуются символы Unicode, так как это значительно упрощает анализ ширины строк, но можно точно написать оболочку для преобразования между кодировками.

Доступная реализация

Здесь является подходящей и переносимой реализацией, которую можно подключить к своему приложению и использовать ее в Windows.

0 голосов
/ 28 марта 2012

Прежде всего, API консоли Windows находится здесь .

Во-вторых, нужна ли вам функция GetConsoleFontSize ?

Я постараюсь быстро набрать пример за секунду.

РЕДАКТИРОВАТЬ: Вот, пожалуйста. Простите, если есть небольшая ошибка. Я на самом деле обнаружил, что это было еще проще. GetCurrentConsoleFont заполняет структуру COORD на пути к получению индекса для передачи на GetConsoleFontSize, поэтому шаг сохранен:)

#define _WIN32_WINNT 0x0501 //XP, 0x0601=windows 7
#include <windows.h>

int main()
{
    HANDLE hStdOutput = GetStdHandle (STD_OUTPUT_HANDLE);

    CONSOLE_FONT_INFO cfi;
    GetCurrentConsoleFont (hStdOutput, FALSE, &cfi);

    //cfi.dwFontSize.X == x size
    //cfi.dwFontSize.Y == y size
}

EDIT:

Если вы не возражаете против невидимого вывода, вы можете использовать CreateConsoleScreenBuffer, чтобы в значительной степени иметь невидимое консольное окно в вашей команде, оставляя ваше незатронутым. GetConsoleScreenBufferInfoEx сообщит вам позицию курсора, и в этот момент вы можете использовать WriteConsole для записи в ваш буфер (невидимо) и снова проверить местоположение курсора в зависимости от количества фактически написанных символов. Обратите внимание, что проверка местоположения курсора заранее не потребует очистки экрана для использования этого метода.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...