c# - RichTextBox 无法显示 Unicode 数学字母数字符号

标签 c# .net winforms unicode richtextbox

我无法让 WinForms RichTextBox 显示一些 Unicode 字符,尤其是 Mathematical alphanumeric symbols (但问题很可能不仅限于这些)。

令人惊讶的是,相同的字符可以使用相同(默认)字体显示在普通或多行 TextBox 中。即使我将字体更改为例如“Arial”或“Lucida”,我也会得到相同的结果。

TextBox vs. RichTextBox

屏幕截图来自 Windows 10,但我在 Windows 7 上得到了相同的结果。示例显示 ascii small a-d 后跟 mathematical italic sans-serif small 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

  • 您可以使用最新版本的 RichTextBox,即 RICHEDIT50W,为此您应该继承标准 RichTextBox 并覆盖 CreateParams 并加载库 Msftedit.dll 并将 ClassName 设置为 RICHEDIT50W

要查看实现,请查看 this post .

关于c# - RichTextBox 无法显示 Unicode 数学字母数字符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47433656/

相关文章:

c# - 从 .NET 3.5 中的单独线程设置 Form.Owner

c# - 在 MSPaint 中模拟鼠标点击

c# - asp.net 网站项目设置存储在哪里?

.net - .NET 中的嵌入式系统项目

c# - 使用c#在MSChart中显示系列的具体方法

vb.net - 将未处理的异常记录到日志文件

c# - Mono xbuild 错误 CS1548 - key 文件格式不正确

c# - 在 Outlook 中处理大量邮件

c# - 如何使用 ZeroMQ 解决 'NetMQ.AddressAlreadyInUseException'

.net - ASP.NET Core (.NET 5) + Angular 11 = 在空项目上构建错误