微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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写入缓冲区(不可见),然后再次检查光标位置与实际写入的字符数.请注意,事先检查光标位置不需要清除屏幕即可使用此方法.

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐