C# 将CJK字符粘贴到RichTextBox会添加不需要的第二种字体

C# 将CJK字符粘贴到RichTextBox会添加不需要的第二种字体,c#,unicode,fonts,richtextbox,cjk,C#,Unicode,Fonts,Richtextbox,Cjk,如果将下面的内容粘贴到RichTextBox中,CJK字符和之后的所有内容都会变成第二种字体-SimSun 插入CJK字符:色 …更改此字体 这会以一种不必要的方式影响RichTextBox的格式设置,并大大降低大型复制/粘贴的速度 我尝试将RichTextBox设置为使用unicode字体,如“Lucida Sans unicode”,并确保我从中复制的源(写字板)也使用“Lucida Sans unicode”字体。然而,在一天结束时,当我粘贴到RichTextBox时,它会强制使用另一种字

如果将下面的内容粘贴到RichTextBox中,CJK字符和之后的所有内容都会变成第二种字体-SimSun

插入CJK字符:色

…更改此字体

这会以一种不必要的方式影响RichTextBox的格式设置,并大大降低大型复制/粘贴的速度

我尝试将RichTextBox设置为使用unicode字体,如“Lucida Sans unicode”,并确保我从中复制的源(写字板)也使用“Lucida Sans unicode”字体。然而,在一天结束时,当我粘贴到RichTextBox时,它会强制使用另一种字体,如SimSun(或其他字体,如“Shonar Bangla”或“Microsoft Himalaya”,如果我们使用其他类型的字符)

既然“Lucida Sans Unicode”拥有所有这些字体,为什么不能坚持使用一种字体呢

我注意到其他人也有类似的问题:


不幸的是,该页面上的解决方案对我不起作用,因为我仍然发现RTB在CJK字符之后使用了另一种字体。

不幸的是,尽管名称有点混乱,
Lucida Sans Unicode
不包含CJK字符(正如您可以从名称中包含Unicode的字体中所期望的那样)。这会触发某种字体回退机制,从而生成包含所需符号的字体。我所看到的唯一可能的解决方案是使用一种实际上包含所有必需字符的字体。

为了补充Petr的答案(并部分使用他评论中的信息),许多Unicode符号在RichTextBox中的呈现速度要慢得多


但是通过过滤掉1280(0x500)或更大的unicode字符,我发现粘贴速度和以前一样快。

我自己也经常遇到这个问题

今天在互联网上四处转悠之后,我注意到msdn上的一些东西,并尝试了一些东西。将此行添加到
Form1\u Load()
,或添加到
InitializeComponent()
行之后的表单构造函数:

richTextBox1.LanguageOption = RichTextBoxLanguageOptions.DualFont;

我不是专家,我不能告诉你为什么它有效,但它对我有用

整个Unicode标准非常庞大,需要几兆字节大小的字体才能实现。如果你使用像Bitstream Vera这样的字体,它涵盖了最常用的脚本,只是不包括古代脚本、克林贡语等。也许没有那么容易混淆的名称…
sans
在法语中的意思是
而不是
。@Mark:我同意,除非有一种字体叫做“Lucida sans”。所以这里的“Sans”指的是无衬线。@Petr:你说得对。替代使用Arial Unicode MS似乎可以解决“多字体”问题。然而,即使使用Arial Unicode MS,行距仍然是混合的,我认为这使得复制/粘贴速度比普通字符慢。CJK符号显示/绘制通常比普通字符慢一个数量级(至少)。至于线的高度,不能肯定,也许只是因为CJK符号的大小?有趣。你用哪种字体?显然,它需要至少包含unicode集合的相当一部分。我试过了,是的,它似乎使每一行的高度相同。不幸的是,它在加载混合文本(要测试,请尝试wikipedia上的“颜色列表”源代码)和某些unicode字符(例如రంగుల పట్టిక) 不要毫发无损地通过(它们变成了盒子)。