Skip to content

Commit 04587bd

Browse files
committed
feat(字符串扩展): 添加计算字符串显示宽度的方法
新增 GetDisplayWidth 扩展方法用于计算字符串在等宽环境下的显示宽度,汉字等宽字符计为2个单位宽度,其他字符计为1个单位宽度。主要用于控制台或等宽字体环境下的文本对齐。
1 parent 2b171ff commit 04587bd

1 file changed

Lines changed: 25 additions & 0 deletions

File tree

GameFrameX.Foundation.Extensions/StringExtensions.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,31 @@ public static string FromUrlSafeBase64(this string value, bool addPadding)
113113
/// </remarks>
114114
private static readonly Regex CnReg = new(@"[\u4e00-\u9fa5]");
115115

116+
/// <summary>
117+
/// 计算字符串的显示宽度,汉字等宽字符算作2个单位宽度,其他字符算作1个单位宽度。
118+
/// </summary>
119+
/// <param name="text">要计算宽度的字符串。</param>
120+
/// <returns>字符串的显示宽度。汉字等宽字符计为2,其他字符计为1。</returns>
121+
/// <remarks>
122+
/// 此方法主要用于控制台或等宽字体环境下的文本对齐。
123+
/// 支持的中文字符范围包括:
124+
/// - 基本汉字区(\u4e00-\u9fff)
125+
/// - 扩展A区汉字(\u3400-\u4dbf)
126+
/// - 扩展B区汉字(\u20000-\u2a6df),但在C#中由于char是16位,高位部分需要代理对表示,此处简化处理
127+
/// 其他字符(英文、数字、标点等)均按1个单位宽度计算。
128+
/// </remarks>
129+
public static int GetDisplayWidth(this string text)
130+
{
131+
int total = 0;
132+
foreach (var c in text)
133+
{
134+
var isChineseChar = (c >= '\u4e00' && c <= '\u9fff') || (c >= '\u3400' && c <= '\u4dbf') || (c >= '\u2000' && c <= '\u2a6d');
135+
total += isChineseChar ? 2 : 1;
136+
}
137+
138+
return total;
139+
}
140+
116141
/// <summary>
117142
/// 重复指定字符指定次数。
118143
/// </summary>

0 commit comments

Comments
 (0)