-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProgram.cs
More file actions
161 lines (140 loc) · 9.64 KB
/
Copy pathProgram.cs
File metadata and controls
161 lines (140 loc) · 9.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
// WideCharRepro - Minimal reproduction of wide/fullwidth character rendering issues.
//
// PURPOSE:
// Many terminal emulators incorrectly handle "wide" (fullwidth) Unicode codepoints
// (those with East Asian Width = Wide/Fullwidth, or emoji presentation). These
// characters occupy 2 terminal columns, but some terminals only advance the cursor
// by 1 column, causing subsequent text to overlap and the display to "tear."
//
// EXPECTED BEHAVIOR (correct terminals like Windows Terminal):
// - Each wide character occupies exactly 2 columns.
// - The grid lines up perfectly with no overlapping or shifted text.
// - The separator '|' characters in each row are vertically aligned.
//
// BROKEN BEHAVIOR (terminals with the bug):
// - Wide characters only advance the cursor 1 column instead of 2.
// - Grid columns misalign; text overlaps or shifts left.
// - Vertical '|' separators are NOT aligned across rows.
//
// HOW TO USE:
// dotnet run
// Compare output against a known-good terminal (e.g., Windows Terminal).
//
// DIAGNOSIS:
// If the '|' separators are not vertically aligned, the terminal is not
// correctly handling wide character cursor advancement.
using System.Text;
Console.OutputEncoding = Encoding.UTF8;
// Ensure we're in a mode that supports Unicode output
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{
// Enable virtual terminal processing on Windows
Console.Write ("\x1b[?25l"); // Hide cursor for cleaner output
}
Console.WriteLine (
"ΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉ");
Console.WriteLine (" Wide Character Rendering Test");
Console.WriteLine (" If '|' separators are NOT vertically aligned, the terminal has");
Console.WriteLine (" a wide-character cursor advancement bug.");
Console.WriteLine (
"ΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉ");
Console.WriteLine ();
// --- Test 1: Emoji (U+1F600 - U+1F64F) ---
Console.WriteLine ("TEST 1: Emoji (each should occupy 2 columns)");
Console.WriteLine (
"ΓöîΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÉ");
var startCodepoint = 0x1F600;
for (var row = 0; row < 4; row++)
{
Console.Write ("Γöé");
for (var col = 0; col < 16; col++)
{
var cp = startCodepoint + row * 16 + col;
var ch = char.ConvertFromUtf32 (cp);
Console.Write (ch);
Console.Write ("Γöé");
}
Console.WriteLine ();
}
Console.WriteLine (
"ΓööΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÿ");
Console.WriteLine ();
// --- Test 2: CJK Ideographs (U+4E00+) ---
Console.WriteLine ("TEST 2: CJK Ideographs (each should occupy 2 columns)");
Console.WriteLine (
"ΓöîΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÉ");
startCodepoint = 0x4E00;
for (var row = 0; row < 4; row++)
{
Console.Write ("Γöé");
for (var col = 0; col < 16; col++)
{
var cp = startCodepoint + row * 16 + col;
var ch = char.ConvertFromUtf32 (cp);
Console.Write (ch);
Console.Write ("Γöé");
}
Console.WriteLine ();
}
Console.WriteLine (
"ΓööΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÿ");
Console.WriteLine ();
// --- Test 3: Mixed narrow + wide on same line ---
// Each line below is EXACTLY 20 display columns between the Γöé delimiters.
Console.WriteLine ("TEST 3: Mixed content alignment");
Console.WriteLine ("All lines are exactly 20 display columns. The 'Γöé' must align:");
Console.WriteLine ("ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ");
Console.WriteLine ("│ABCDEFGHIJKLMNOPQRST│ <- 20 narrow (20×1=20)");
Console.WriteLine ("│😀😁😂😃😄😅😆😇😈😉│ <- 10 emoji (10×2=20)");
Console.WriteLine ("│你好世界测试宽字符验│ <- 10 CJK (10×2=20)");
Console.WriteLine ("│AB😀CD😁EF😂GH😃IJ😄│ <- mixed (10×1 + 5×2=20)");
Console.WriteLine ("ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ");
Console.WriteLine ();
// --- Test 4: ANSI cursor positioning with wide chars ---
Console.WriteLine ("TEST 4: Programmatic cursor-positioned grid");
Console.WriteLine (" Writing wide chars at absolute positions via ANSI escapes.");
Console.WriteLine (" If the terminal handles wcwidth correctly, all rows align.");
Console.WriteLine ();
// Get current cursor row (approximate - just write sequentially with known widths)
string[] testRows =
[
"│😀│😁│😂│🤣│😄│😅│😆│😇│",
"ΓöéΓöÇΓöÇΓöéΓöÇΓöÇΓöéΓöÇΓöÇΓöéΓöÇΓöÇΓöéΓöÇΓöÇΓöéΓöÇΓöÇΓöéΓöÇΓöÇΓöéΓöÇΓöÇΓöé",
"│🐶│🐱│🐭│🐹│🐰│🦊│🐻│🐼│",
"ΓöéΓöÇΓöÇΓöéΓöÇΓöÇΓöéΓöÇΓöÇΓöéΓöÇΓöÇΓöéΓöÇΓöÇΓöéΓöÇΓöÇΓöéΓöÇΓöÇΓöéΓöÇΓöÇΓöé",
"│你│好│世│界│测│试│宽│字│",
"ΓöéΓöÇΓöÇΓöéΓöÇΓöÇΓöéΓöÇΓöÇΓöéΓöÇΓöÇΓöéΓöÇΓöÇΓöéΓöÇΓöÇΓöéΓöÇΓöÇΓöéΓöÇΓöÇΓöé"
];
Console.WriteLine ("ΓöîΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÉ");
foreach (var line in testRows)
{
Console.WriteLine (line);
}
Console.WriteLine ("ΓööΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÿ");
Console.WriteLine ();
// --- Test 5: Explicit column-counting verification ---
Console.WriteLine ("TEST 5: Column-width verification");
Console.WriteLine (" The 'X' markers below should align with column 20:");
Console.WriteLine ();
Console.WriteLine ("01234567890123456789X <- 20 narrow (20×1=20)");
Console.WriteLine ("😀😁😂😃😄😅😆😇😈😉X <- 10 emoji (10×2=20)");
Console.WriteLine ("你好世界测试宽字符验X <- 10 CJK (10×2=20)");
Console.WriteLine ("aあbいcうdえeおfかきX <- mixed (6×1 + 7×2=20)");
Console.WriteLine ();
Console.WriteLine ("If the 'X' markers don't vertically align at column 20,");
Console.WriteLine ("the terminal is miscounting wide character widths.");
Console.WriteLine ();
// --- Summary ---
Console.WriteLine (
"ΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉ");
Console.WriteLine (" DIAGNOSIS:");
Console.WriteLine (" • If all grids have aligned '│' separators → terminal is CORRECT");
Console.WriteLine (" • If grids are torn/misaligned → terminal has wcwidth bug");
Console.WriteLine (" ΓÇó Common cause: terminal treats wide chars as 1 column, not 2");
Console.WriteLine (
"ΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉ");
// Show cursor again
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{
Console.Write ("\x1b[?25h");
}