RichTextBox无法显示Unicode数学字母数字符号
我无法让WinForms RichTextBox
显示一些Unicode字符,特别是数学字母数字符号 (但问题很可能不仅限于那些)。
令人惊讶的是,相同的字符可以使用相同的(默认)字体显示在普通或多行TextBox
。 即使我将字体更改为例如“Arial”或“Lucida”,我也会得到相同的结果。
屏幕截图来自Windows 10,但我在Windows 7上得到了相同的结果。该示例显示ascii小广告,后跟数学斜体sans-serif小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
中设计的错误/决定,已在.NET 4.7中修复。
RichTextBox
实际上是RichEdit
的包装器。 在.NET 4.7中,控件使用RICHEDIT50W
而在以前的版本中,它使用的是RichEdit20W
。
要解决此问题,您可以使用以下任一选项:
- 升级到.NET 4.7
要么
- 您可以使用
RICHEDIT50W
的最新版RichTextBox
,RICHEDIT50W
,您应该从标准RichTextBox
inheritance并覆盖CreateParams
并加载库Msftedit.dll
并将ClassName
设置为RICHEDIT50W
。
要查看实现,请查看此post 。