Windows版本的wcswidth_l

我有一些文本写入到Windows控制台,我需要知道列的真正宽度。 wcswidth_l似乎是有它的平台上的最佳select(虽然mbswidth_l()会更好,因为我不想使用wchar_t,但由于某种原因它不存在)。 但除了其他平台之外,我还需要一些可以在Windows上运行的东西。 虽然这不太可能有一个便携式的解决scheme,我不知道任何Windows上的解决scheme。 我认为控制台有一个获取光标位置的API,所以我可以写出文本并检查位置的变化。 我想这是准确的,但写出额外的输出是不可接受的。

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

编辑:

wcswidth_l返回用于显示string的控制台列数。 一些字符占据一列,而另外一些字符如日文字符则占两位。

作为例子,“aあ”的“​​列宽”是四个。 “a”是一个,“是”,“a”是两个。 (假设控制台设置为实际显示非ascii字符)。 如果API支持使用代码页65001(UTF-8)的string,那也不错。

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

如果你不能做额外的输出,可见或不可见,我不确定是否有可能。

便携的方法

由于字符的宽度更多取决于字符本身,而不是显示它们的系统(好的,可能有exceltions,但它们应该是相当罕见的),可以使用单独的函数来做到这一点(在Windows上)。 这需要Unicode字符,因为它使得分析字符串的宽度变得更容易,但是肯定的是可以编写一个包装来在编码之间进行转换。

可用的实现

这里是适合的和可移植的实现,哪一个可以插入他的应用程序,并回退到Windows上使用它。