繁体   English   中英

如何可靠地确定 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个字符宽度?

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

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

根据 .NET 文档,如果您知道使用的字体1 ,则可以使用GlyphTypeface API获取字体每个字形的“AdvanceWidths”

您仍然需要 map 字体中带有字形索引的字符。 您可以使用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]要获取当前控制台的字体详细信息,我建议阅读以下问题: Get current console font info

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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