RichTextBox 无法显示 Unicode 数学字母数字符号
RichTextBox cannot display Unicode Mathematical alphanumeric symbols
我无法让 WinForms RichTextBox
显示一些 Unicode 字符,尤其是 Mathematical alphanumeric symbols(但问题很可能不限于这些)。
令人惊讶的是,相同的字符可以使用相同的(默认)字体以普通或多行显示 TextBox
。即使我将字体更改为例如 "Arial" 或 "Lucida",我也会得到相同的结果。
屏幕截图来自 Windows 10,但我在 Windows 7 上得到了相同的结果。示例显示 ascii small a-d 后跟数学斜体无衬线小 alpha-delta.
我正在使用 Visual Studio 2017 和 .NET 4.6.1。
一个简单的测试代码:
private void InitializeComponent()
{
this.textBox1 = new System.Windows.Forms.TextBox();
this.richTextBox1 = new System.Windows.Forms.RichTextBox();
// ...
this.SuspendLayout();
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(25, 38);
this.textBox1.Multiline = true;
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(182, 108);
this.textBox1.TabIndex = 0;
this.textBox1.Text = "abcd ";
//
// richTextBox1
//
this.richTextBox1.Location = new System.Drawing.Point(213, 38);
this.richTextBox1.Name = "richTextBox1";
this.richTextBox1.Size = new System.Drawing.Size(179, 108);
this.richTextBox1.TabIndex = 1;
this.richTextBox1.Text = "abcd ";
// ...
}
请注意,存储字符似乎没有问题。字符正确存储在 RichTextBox
中。如果您复制文本并将其粘贴到某处(例如 TextBox
),所有字符都会正确显示。
另一方面,如果您将字符粘贴到 RichTextBox
,您会得到同样的错误显示。
看来只是显示问题。
这是 RichTextBox
中的 bug/decision 设计,已在 .NET 4.7 中修复。
RichTextBox
实际上是 RichEdit
的包装器。在 .NET 4.7 中,控件使用 RICHEDIT50W
而在以前的版本中它使用 RichEdit20W
.
要解决此问题,您可以使用以下任一选项:
- 升级到 .NET 4.7
或
- 您可以使用
RichTextBox
的最新版本 RICHEDIT50W
,为此您应该继承标准 RichTextBox
并覆盖 CreateParams
并加载库 Msftedit.dll
并将 ClassName
设置为 RICHEDIT50W
。
要查看实现,请查看 。
我无法让 WinForms RichTextBox
显示一些 Unicode 字符,尤其是 Mathematical alphanumeric symbols(但问题很可能不限于这些)。
令人惊讶的是,相同的字符可以使用相同的(默认)字体以普通或多行显示 TextBox
。即使我将字体更改为例如 "Arial" 或 "Lucida",我也会得到相同的结果。
屏幕截图来自 Windows 10,但我在 Windows 7 上得到了相同的结果。示例显示 ascii small a-d 后跟数学斜体无衬线小 alpha-delta.
我正在使用 Visual Studio 2017 和 .NET 4.6.1。
一个简单的测试代码:
private void InitializeComponent()
{
this.textBox1 = new System.Windows.Forms.TextBox();
this.richTextBox1 = new System.Windows.Forms.RichTextBox();
// ...
this.SuspendLayout();
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(25, 38);
this.textBox1.Multiline = true;
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(182, 108);
this.textBox1.TabIndex = 0;
this.textBox1.Text = "abcd ";
//
// richTextBox1
//
this.richTextBox1.Location = new System.Drawing.Point(213, 38);
this.richTextBox1.Name = "richTextBox1";
this.richTextBox1.Size = new System.Drawing.Size(179, 108);
this.richTextBox1.TabIndex = 1;
this.richTextBox1.Text = "abcd ";
// ...
}
请注意,存储字符似乎没有问题。字符正确存储在 RichTextBox
中。如果您复制文本并将其粘贴到某处(例如 TextBox
),所有字符都会正确显示。
另一方面,如果您将字符粘贴到 RichTextBox
,您会得到同样的错误显示。
看来只是显示问题。
这是 RichTextBox
中的 bug/decision 设计,已在 .NET 4.7 中修复。
RichTextBox
实际上是 RichEdit
的包装器。在 .NET 4.7 中,控件使用 RICHEDIT50W
而在以前的版本中它使用 RichEdit20W
.
要解决此问题,您可以使用以下任一选项:
- 升级到 .NET 4.7
或
- 您可以使用
RichTextBox
的最新版本RICHEDIT50W
,为此您应该继承标准RichTextBox
并覆盖CreateParams
并加载库Msftedit.dll
并将ClassName
设置为RICHEDIT50W
。
要查看实现,请查看