Как отформатировать китайские иероглифы, чтобы они соответствовали столбцам? - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь напечатать некоторую информацию ориентированным на столбцы способом. Все хорошо работает для латинских символов, но когда печатаются китайские символы, столбцы перестают выравниваться. Давайте рассмотрим пример:

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

Как видно, китайцы не выровнены по столбцам. Важное примечание: это просто изложение проблемы; он не будет использоваться в консольном приложении. Кто-нибудь может мне помочь с этим?

Ответы [ 3 ]

0 голосов
/ 16 января 2019

Вы можете использовать метод TextRenderer.MeasureText из сборки System.Windows.Forms для построения выходного текста на основе ширины строки вместо количества символов.

Вот метод 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; 

Для решения требуется параметр заполнения (в пикселях) и используемый шрифт.

0 голосов
/ 16 января 2019

Я могу представить только одно общее решение с отступом. Вы должны использовать моноширинный шрифт, и все символы обоих алфавитов должны быть одинакового размера. На самом деле функция PaddingRight просто добавляет указанное количество символов в строку. Но отображаемый размер строки также зависит от шрифта. Если вы используете моноширинный шрифт, он будет работать, в других случаях даже для латинских символов - нет. По моему мнению, лучше решать проблему для каждого конкретного вывода, который вы собираетесь использовать, потому что строка itsefl ничего не знает о том, как он будет отображаться, и более того, он не должен знать об этом.

0 голосов
/ 16 января 2019

Я попробовал приведенный ниже код, так как у меня нет поддержки китайского языка, я не могу его протестировать.

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));
...