【问题标题】:Some Unicode characters are not drawn using DrawString method某些 Unicode 字符不是使用 DrawString 方法绘制的
【发布时间】:2019-12-08 14:19:08
【问题描述】:

这是我测试中 csharp 代码的奇怪行为之一。

我使用 DrawString 方法在 Times New Roman 字体下绘制一些 unicode 字符。但是,我可以绘制一些字符,但有些字符只是绘制为空白方块(即不支持的字符。

更详细地说,我可以使用 DrawString 方法毫无问题地绘制 42 (*) 和 43 (+)。

但我不能画9978和9900。9978和9900都是Times New Roman支持的字符。在此处检查字体映射。

https://www.martinstoeckli.ch/fontmap/fontmap.html

供您参考,当我尝试在文本框窗口控件中打印相同的字符时,一切正常。文本框显示所有支持的字符,包括 9978 和 9900。

但是,只是这个DrawString方法在我的测试下是不一致的。为什么我不能使用 DrawString 方法在字体下绘制这些支持的字符?

int unicodeIndex = 10728;

this._provider = new CultureInfo("en-us");

string unicodeString = ((char)unicodeIndex).ToString(_provider);

this.Font = new Font("Times New Roman", 10);


int x = 200;
int y = 200;

SizeF sizef = g.MeasureString(unicodeString+"W", this.Font, new PointF(x, y), _sformat);
int w = Convert.ToInt32(sizef.Width) + 2;
int h = Convert.ToInt32(sizef.Height) + 2;


RectangleF rectf = new RectangleF(x, y-h/2, w, h);


g.DrawString(unicodeString, this.Font, myBrush, rectf, myFormat);

这里有更多线索,因为这似乎是一个棘手的问题。

我目前正在使用安装在我的 Window 上的东亚语言包。 安装在我的窗口上的东亚语言包有没有可能导致这个问题?例如,在中文和日文的本地化窗口中,“Times New Roman”字体可能无法正确调用?只是猜测。

【问题讨论】:

  • 9978 是点,9900 是波斯字符。将字体更改为“Tahoma”,然后重试。
  • 我改为“Tahoma”,但它不起作用。我只看到空白方块。但是,42 (*) 和 43 (+) 在“Tahoma”字体下工作正常。

标签: c# unicode


【解决方案1】:

我稍微修改了你的代码,现在运行良好:

private void Form1_Paint(object sender, PaintEventArgs g)
{
    CultureInfo _provider = new CultureInfo("en-us");

    String drawString = ((char)9900).ToString(_provider);

    Font drawFont = new Font("Times New Roman", 16);
    SolidBrush drawBrush = new SolidBrush(Color.Black);

    float x = 150.0F;
    float y = 50.0F;

    StringFormat drawFormat = new StringFormat();

    g.Graphics.DrawString(drawString, drawFont, drawBrush, x, y, drawFormat);
}

【讨论】:

  • 感谢您确认它不适用于我的。安装在我的窗口上的东亚语言包有没有可能导致这个问题?例如,在本地化窗口中,可能无法正确调用“Times New Roman”字体。
  • 我不这么认为,但试试像 Arial 这样的另一种字体也不错。您也可以从代码中删除 CultureInfo 部分。
  • 它也不起作用。我想安装的语言包一定对此有一些影响,我猜。对于许多使用外来键盘输入的窗口可能会遇到同样的问题。
【解决方案2】:

Times New Roman(任何版本,我很确定)实际上没有相关字符。

https://www.martinstoeckli.ch/fontmap/fontmap.html 的第二句话说:

您在此页面上看到的所有内容都被声明为 Arial 字体,尽管操作系统和浏览器可以用其他字体的字符替换缺失的字符

您在该网页上看到的是字体替换。

【讨论】:

    猜你喜欢
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    相关资源
    最近更新 更多