如何格式化汉字以适合列?
How do I format Chinese characters so they fit the columns?
我正在尝试以面向列的方式打印一些信息。一切都适用于拉丁字符,但是当打印汉字时,列停止对齐。让我们考虑一个例子:
var latinPresentation1 = "some text".PadRight(30) + "| " + 23;
var latinPresentation2 = "some longer text".PadRight(30) + "| " + 23;
Console.WriteLine(latinPresentation1);
Console.WriteLine(latinPresentation2);
Console.WriteLine("..............................................");
var chinesePresentation1 = "一些文字".PadRight(30) + " | " + 23;
var chinesePresentation2 = "一些較長的文字".PadRight(30) + "| " + 23;
Console.WriteLine(chinesePresentation1);
Console.WriteLine(chinesePresentation2);
输出:
some text | 23
some longer text | 23
.................................................
一些文字 | 23
一些較長的文字 | 23
可以看出,中文没有按列对齐。
重要说明:这只是问题的介绍;它不会在控制台应用程序中使用。谁能帮我解决这个问题?
我试过下面的代码,因为我没有中文支持,所以无法测试。
var latinPresentation1 = "some text" ;
var latinPresentation2 = "some longer text";
Console.WriteLine(String.Format("{0,-30} {1,-10} ", latinPresentation1, "| " + 23));
Console.WriteLine(String.Format("{0,-30} {1,-10} ", latinPresentation2, "| " + 23));
Console.WriteLine("..............................................");
var chinesePresentation1 = "一些文字";
var chinesePresentation2 = "一些較長的文字";
Console.WriteLine(String.Format("{0,-30} {1,-10} ", chinesePresentation1, "| " + 23));
Console.WriteLine(String.Format("{0,-30} {1,-10} ", chinesePresentation2, "| " + 23));
您可以使用 System.Windows.Forms 程序集中的 TextRenderer.MeasureText 方法根据字符串宽度而不是字符计数构建输出文本。
这是 util 方法:
public static string FillWithSpaces(this string text, int width, Font font)
{
while (TextRenderer.MeasureText(text, font).Width < width)
{
text += ' ';
}
return text;
}
以及用法:
var font = new Font("Courier New", 10.0F);
var padding = 340;
var latinPresentation1 = "some text ".FillWithSpaces(padding, font) + "| 23";
var latinPresentation2 = "some longer text".FillWithSpaces(padding, font) + "| 23";
var chinesePresentation1 = "一些文字".FillWithSpaces(padding, font) + "| 23";
var chinesePresentation2 = "一些較長的文字".FillWithSpaces(padding, font) + "| 23";
var result = latinPresentation1 + Environment.NewLine +
latinPresentation2 + Environment.NewLine +
".............................................." + Environment.NewLine +
chinesePresentation1 + Environment.NewLine +
chinesePresentation2;
该解决方案需要填充参数(以 px 为单位)和使用的字体。
我只能想象一种带有填充的通用解决方案。您必须使用等宽字体,并且两个字母的所有符号必须大小相同。实际上 PaddingRight 函数只是将提供的符号数量添加到字符串中。但显示的字符串大小也取决于字体。如果你使用等宽字体它会工作,在其他情况下,即使是拉丁符号它也不会。在我看来,最好为您将要使用的每个特定输出解决问题,因为字符串本身对它的呈现方式一无所知,更重要的是它不应该知道它。
我正在尝试以面向列的方式打印一些信息。一切都适用于拉丁字符,但是当打印汉字时,列停止对齐。让我们考虑一个例子:
var latinPresentation1 = "some text".PadRight(30) + "| " + 23;
var latinPresentation2 = "some longer text".PadRight(30) + "| " + 23;
Console.WriteLine(latinPresentation1);
Console.WriteLine(latinPresentation2);
Console.WriteLine("..............................................");
var chinesePresentation1 = "一些文字".PadRight(30) + " | " + 23;
var chinesePresentation2 = "一些較長的文字".PadRight(30) + "| " + 23;
Console.WriteLine(chinesePresentation1);
Console.WriteLine(chinesePresentation2);
输出:
some text | 23
some longer text | 23
.................................................
一些文字 | 23
一些較長的文字 | 23
可以看出,中文没有按列对齐。 重要说明:这只是问题的介绍;它不会在控制台应用程序中使用。谁能帮我解决这个问题?
我试过下面的代码,因为我没有中文支持,所以无法测试。
var latinPresentation1 = "some text" ;
var latinPresentation2 = "some longer text";
Console.WriteLine(String.Format("{0,-30} {1,-10} ", latinPresentation1, "| " + 23));
Console.WriteLine(String.Format("{0,-30} {1,-10} ", latinPresentation2, "| " + 23));
Console.WriteLine("..............................................");
var chinesePresentation1 = "一些文字";
var chinesePresentation2 = "一些較長的文字";
Console.WriteLine(String.Format("{0,-30} {1,-10} ", chinesePresentation1, "| " + 23));
Console.WriteLine(String.Format("{0,-30} {1,-10} ", chinesePresentation2, "| " + 23));
您可以使用 System.Windows.Forms 程序集中的 TextRenderer.MeasureText 方法根据字符串宽度而不是字符计数构建输出文本。
这是 util 方法:
public static string FillWithSpaces(this string text, int width, Font font)
{
while (TextRenderer.MeasureText(text, font).Width < width)
{
text += ' ';
}
return text;
}
以及用法:
var font = new Font("Courier New", 10.0F);
var padding = 340;
var latinPresentation1 = "some text ".FillWithSpaces(padding, font) + "| 23";
var latinPresentation2 = "some longer text".FillWithSpaces(padding, font) + "| 23";
var chinesePresentation1 = "一些文字".FillWithSpaces(padding, font) + "| 23";
var chinesePresentation2 = "一些較長的文字".FillWithSpaces(padding, font) + "| 23";
var result = latinPresentation1 + Environment.NewLine +
latinPresentation2 + Environment.NewLine +
".............................................." + Environment.NewLine +
chinesePresentation1 + Environment.NewLine +
chinesePresentation2;
该解决方案需要填充参数(以 px 为单位)和使用的字体。
我只能想象一种带有填充的通用解决方案。您必须使用等宽字体,并且两个字母的所有符号必须大小相同。实际上 PaddingRight 函数只是将提供的符号数量添加到字符串中。但显示的字符串大小也取决于字体。如果你使用等宽字体它会工作,在其他情况下,即使是拉丁符号它也不会。在我看来,最好为您将要使用的每个特定输出解决问题,因为字符串本身对它的呈现方式一无所知,更重要的是它不应该知道它。