如何可靠地确定 C# 中字符的宽度?

How to reliably determine the width of a character in C#?

我正在编写一个 C# 程序,我正在使用固定宽度的字体来显示所有内容。在这种字体下,每个 Unicode 字符要么占用 1 个字符宽度,要么占用 2 个字符宽度。程序中有一个特点,需要判断某个字符占用1个字符宽度还是2个字符宽度。起初我使用正则表达式 [^\x00-\xFF] 来解决问题。如果一个字符匹配它,它占用 1 个字符宽度,否则它是 2 个字符宽度。但后来我发现这是不正确的。例如,┌─┬┐│├┼┤┴┘这些字符不在[^\x00-\xFF]范围内,但它们都只占1个字符宽度。我想知道在C#中使用固定宽度字体时如何确定特定字符占用1个字符宽度或2个字符宽度?

根据 .NET 文档,如果您知道使用的字体1,您可以使用您的字体的 GlyphTypeface API to get the "AdvanceWidths" of each glyph

你仍然需要在你的字体中映射带有字形索引的字符。您可以使用 CharacterToGlyphMap 来做到这一点。

var character = 'x';

GlyphTypeface glyphTypeface = new GlyphTypeface(new Uri("file:///C:\WINDOWS\Fonts\Kooten.ttf"));

var index = glyphTypeface.CharacterToGlyphMap[character];
var width = glyphTypeface.AdvanceWidths[index];

[1] 要获取当前控制台的字体详细信息,我建议阅读以下问题:

相关问题:How to find exact size for an arbitrary glyph in WPF?

我也在寻找相同问题的答案...但我没有找到。 顺便说一句,我终于写了一个库来获取字符长度(使用Console.Write()和Console.CursorLeft生成显示字符长度的范围信息,然后转换为C#代码,当获取字符长度时,使用二进制搜索以获得更高的速度)

nuget: NullLib.ConsoleEx 项目:https://github.com/SlimeNull/NullLib.ConsoleEx