繁体   English   中英

Windows版本的wcswidth_l

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM