c-Windows版本的wcswidth_l

我有一些文字要写到Windows控制台,我需要知道in列的实际宽度. wcswidth_l似乎是拥有它的平台上的最佳选择(尽管mbswidth_l()会更好,因为我不想使用wchar_t,但由于某种原因它并不存在).但是除了其他平台,我还需要在Windows上可以运行的东西.尽管不太可能有便携式解决方案,但我对Windows上的任何解决方案一无所知.我认为控制台具有用于获取光标位置等的API,因此我可以将文本写出来并检查位置的变化.我猜那是准确的,但是写出额外的输出根本是不可接受的.

如何在Windows上获取字符串或字符的列宽?

编辑:

wcswidth_l返回用于显示字符串的控制台列数.一些字符占据一列,而另一些则占据一列.日语字符,占两个.

例如,“ aあ”的“​​列宽”为四. “ a”是一个,“”是一个,而“あ”是两个. (假设控制台设置为实际显示非ASCII字符).如果API使用代码页65001(UTF-8)支持字符串,那也很好.

解决方法:

首先,Windows控制台API位于here.

其次,您要查找的功能GetConsoleFontSize吗?

我将尝试快速输入示例.

编辑:在这里你去.如果有一个错误,请原谅我.我实际上发现它甚至更容易. GetCurrentConsoleFont在获取索引以将其传递给GetConsoleFontSize的方式上填写了一个COORD结构,因此保存了步骤:)

#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
}

编辑:

如果您不介意不可见的输出,则可以使用CreateConsoleScreenBuffer在您的命令中几乎拥有一个不可见的控制台窗口,同时不影响您的显示. GetConsoleScreenBufferInfoEx会告诉您光标的位置,此时您可以使用WriteConsole写入缓冲区(不可见),然后再次检查光标位置与实际写入的字符数.请注意,事先检查光标位置不需要清除屏幕即可使用此方法.

如果您无力承担额外的输出(可见或不可见),我不确定是否确实存在这种可能性.

相关文章

Windows2012R2备用域控搭建 前置操作 域控主域控的主dns:自...
主域控角色迁移和夺取(转载) 转载自:http://yupeizhi.blo...
Windows2012R2 NTP时间同步 Windows2012R2里没有了internet时...
Windows注册表操作基础代码 Windows下对注册表进行操作使用的...
黑客常用WinAPI函数整理之前的博客写了很多关于Windows编程的...
一个简单的Windows Socket可复用框架说起网络编程,无非是建...