C++ Windows版本的wcswidth_l

C++ Windows版本的wcswidth_l,c++,windows,text,console,C++,Windows,Text,Console,我有一些文本要写入Windows控制台,我需要知道列中的实际宽度。wcswidth_l似乎是拥有它的平台上的最佳选择(尽管mbswidth_l()会更好,因为我不想使用wchar_t,但出于某种原因它并不存在)。但除了其他平台,我还需要在Windows上工作的东西。虽然不太可能有一个可移植的解决方案,但我对Windows上的任何解决方案都一无所知。我认为控制台有一个获取光标位置的API,所以我可以写出文本并检查位置的变化。我想这是准确的,但写出额外的输出是完全不能接受的 如何在Windows上获

我有一些文本要写入Windows控制台,我需要知道列中的实际宽度。wcswidth_l似乎是拥有它的平台上的最佳选择(尽管
mbswidth_l()
会更好,因为我不想使用wchar_t,但出于某种原因它并不存在)。但除了其他平台,我还需要在Windows上工作的东西。虽然不太可能有一个可移植的解决方案,但我对Windows上的任何解决方案都一无所知。我认为控制台有一个获取光标位置的API,所以我可以写出文本并检查位置的变化。我想这是准确的,但写出额外的输出是完全不能接受的

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

编辑:

wcswidth_l返回用于显示字符串的控制台列数。某些字符占用一列,而其他字符(如日语字符)占用两列


例如,“a”的“列宽”あ" 是四。‘a’是一,’是一,和’あ' 是2。(假设控制台设置为实际显示非ascii字符)。如果API支持使用代码页65001(UTF-8)的字符串也很好。

首先,Windows控制台API位于

第二,你想要的功能是什么

我将尝试在一秒钟内快速键入一个示例

编辑:给你。如果有一个小错误,请原谅。事实上,我发现这更容易。
GetCurrentConsoleFont
在将索引传递到
GetConsoleFontSize
的过程中填充了一个
COORD
结构,因此步骤已保存:)

#定义_WIN32_WINNT 0x0501//XP,0x0601=windows 7
#包括
int main()
{
HANDLE hStdOutput=GetStdHandle(标准输出句柄);
控制台字体信息cfi;
GetCurrentConsoleFont(hstOutput、FALSE和cfi);
//cfi.dwFontSize.X==X大小
//cfi.dwFontSize.Y==Y大小
}
编辑:

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

如果您负担不起额外的输出,无论是可见的还是不可见的,我不确定是否真的有这种可能性。

便携式方法 由于字符的宽度更多地取决于字符本身,而不是它们显示的系统(好的,可能会有例外,但它们应该非常罕见),因此可以使用单独的函数(在Windows上也是如此)。这需要Unicode字符,因为这样可以更容易地分析字符串的宽度,但可以肯定地编写一个包装器在编码之间进行转换

可用实现
是合适的可移植实现,可以将其插入应用程序并在Windows上回退使用。

不,我不认为
GetConsoleFontSize
是我要寻找的。这似乎返回了有关字体的信息。我想知道在使用特定字符串或字符时,man列是如何被使用的显示在控制台中。我最终决定创建控制台屏幕缓冲区。有一些缺点,比如必须在允许不准确的结果或对任何大于控制台宽度或长于控制台缓冲区的内容进行特殊处理之间进行选择。没有额外输出的原因是什么?性能还是保留g跟踪?无法将UTF-8设置为当前代码页。恐怕您应该习惯使用UTF-16(wchar)。是的,这是一个遗憾,但UTF-8直到1993年才发布,当时Windows NT即将推出。但实际上,任何人都不应该永远、永远、永远编写ANSI或MBCS Windows应用程序。@chris performance,主要是性能,尽管我没有实际衡量额外输出的成本。我们也会计算输出的数量,但我认为编写非常糟糕很明显,控制台API可以解决这个问题。@Ben该程序主要不是Windows程序。在Windows程序中使用UTF-8有一些不幸的限制,但它是可以使用的。例如,您可以将控制台输出cp设置为65001,并将UTF-8写入控制台。我个人认为,当人们eally认为固定大小的代码点将有助于简化文本处理(wchar\u t应该是固定大小的,但UTF-16不是),但正如您所看到的,即使是在完全采用UTF-8的平台上,我也不得不妥协,因为这一传统已经导致除了
wcswidth\u l
之外别无选择。我不知道您可以将控制台设置为与UTF-8一起使用--谢谢。
#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
}