[英]Windows version of wcswidth_l
我有一些文本要写入Windows控制台,我需要知道列中的实际宽度。 wcswidth_l似乎是拥有它的平台上的最佳选择(虽然mbswidth_l()
会更好,因为我不想使用wchar_t,但由于某种原因它不存在)。 但除了其他平台,我需要一些适用于Windows的东西。 虽然不太可能有便携式解决方案,但我在Windows上根本不知道任何解决方案。 我认为控制台有一个用于获取光标位置等的API,所以我可以写出文本并检查位置的变化。 我猜这是准确的,但写出额外的输出是完全不可接受的。
如何在Windows上获取字符串或字符的列宽?
编辑:
wcswidth_l返回用于显示字符串的控制台列数。 有些字符占据一列,而其他字符(例如日文字符)占用两列。
例如,“aあ”的“列宽”为4。 'a'是一个,''是一个,'あ'是两个。 (假设控制台设置为实际显示非ascii字符)。 如果API使用代码页65001(UTF-8)支持字符串,那也很好。
因为字符的宽度更多地取决于字符本身而不是它们所显示的系统(好的,可能存在例外情况,但它们应该相当罕见),可以使用单独的函数来执行此操作(在Windows上也是如此)。 这需要Unicode字符,因为它可以更容易地分析字符串的宽度,但是可以肯定的是可以编写一个包装器来在编码之间进行转换。
这是一个合适的便携式实现,可以插入到他的应用程序中,并在Windows上使用它。
首先,Windows Console API位于此处 。
其次,你正在寻找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
写入缓冲区(隐形),并再次检查光标位置与实际写入的字符数。 请注意,事先检查光标位置不需要清除屏幕以使用此方法。
如果你不能做额外的输出,有形或无形,我不确定是否真的有可能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.