none
Fehlerhafte Darstellung von Unicode in einer RichTextBox (Verdana) RRS feed

  • Frage

  • Hallo,

     

    anscheinend wird in einer RichTextBox Unicode falsch dargestellt, zumindest, wenn man Verdana als Font auswählt.

    Im speziellen wird bei einem meiner Kunden arabischer Text durch Quadrate ersetzt und somit fehlerhaft dargestellt. Ändere ich den Font auf Microsoft Sans Serif, passt alles. 

    Wähle ich stattdessen jedoch für den gleichen Inhalt eine TextBox oder ein Label, funktioniert es einwandfrei mit Verdana.

     

    Hat jemand eine Idee ob man der RichTextBox ein korrektes Verhalten beibringen kann?

     

    Hier mal ein Beispieltext der für eigene Tests verwendet werden kann:


    Arabisches Alphabet
    a, b, t, th, dsch, h´, ch, d, th, r, z, ß, sh, s, d, t, th, a, r, f, q, k, l, m, n, h, w(u), y(i)
    ﺃ, ﺐ, ﺕ, ﺚ, ﺝ, ﺡ, ﺥ, ﺪ, ﺫ, ﺭ, ﺯ, ﺱ, ﺵ, ﺹ , ﺽ, ﻁ , ﻅ, ﻉ, ﻍ, ﻑ, ﻕ, ﻙ, ﻝ, ﻡ, ﻥ, ﻩ, ﻭ, ﻱ

     

    Beste Grüße,

    Michael Groeger

    Freitag, 21. Januar 2011 11:45

Antworten

  • Hallo Michael,

    Hier die unterstützten Unicode-Zeichen bei Verdana:

    [Unicode characters supported by the Verdana font]
    http://www.fileformat.info/info/unicode/font/verdana/list.htm
    (die von Dir gewünschten arabischen Zeichen sind nicht dabei).

    • "Verdana (v. 2.43) uses an incorrect position for combining diacritical marks, causing them to display on the following character instead of the preceding. This makes it unsuitable for Unicode-encoded text such as Cyrillic or Greek.
      [Verdana - Wikipedia, the free encyclopedia]

     


    ciao Frank
    Freitag, 21. Januar 2011 12:25
  • wieso funktioniert das Ganze dann mit einer TextBox und einem Label?
    Michael,
    ich kann inzwischen genau dies mit .NET RichTextBox  (zeigt Quadrate) auch nachvollziehen...

    Ich denke es gibt da unter den Controls unterschiedliche Fallback/Substitution Regeln;
    evtl. nicht zuletzt weil RichTextBox ein native Win32 Control ist (und eh spezielles RTF Font-Handling!),
    aber TextBox & Label AFAIK eher zur Seite .NET Graphics / GDI+ Font Rendering tendieren.

    Ich würde empfehlen, dass du hier besser nur Fonts einsetzt, die auch wirklich Arabic unterstützen.
    Freitag, 21. Januar 2011 12:25

Alle Antworten

  • Hallo Michael

    gemäss dem Character Map Tool meines Windows 7 x64 ENU  enthält Verdana doch gar kein  Arabic Unicode Subrange 
       (jedoch: Microsoft Sans Serif)

    Ich denke weiter gibts auch irgend eine Font-Fallback/Substitution-Einstellung   (ggf je nach Win Version / Landesversion/sprache), die bei deinem PC bzw Kunden noch mit hineinspielt)

    Freitag, 21. Januar 2011 11:55
  • enthält Verdana doch gar kein  Arabic Unicode Subrange    (jedoch: Microsoft Sans Serif)
    was sich übrigens auch mit dem Wordpad  (W7, vormals wohl Write) Tool von Windows nachvollziehen lässt
      (=> Verhalten wie bei deinem Kunden).
    Freitag, 21. Januar 2011 12:09
  • Ok... aber wieso funktioniert das Ganze dann mit einer TextBox und einem Label?

    Gibt es da Fallbacks?

     

    Habe jetzt noch einmal ein komplettes Codesnippet zusammen gestellt:

    using System.Windows.Forms;

    namespace RichTextBoxDoesNotUnderstandArabic
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                string unicodeText = "a, b, t, th, dsch, h´, ch, d, th, r, z, ß, sh, s, d, t, th, a, r, f, q, k, l, m, n, h, w(u), y(i) ﺃ, ﺐ, ﺕ, ﺚ, ﺝ, ﺡ, ﺥ, ﺪ, ﺫ, ﺭ, ﺯ, ﺱ, ﺵ, ﺹ , ﺽ, ﻁ , ﻅ, ﻉ, ﻍ, ﻑ, ﻕ, ﻙ, ﻝ, ﻡ, ﻥ, ﻩ, ﻭ, ﻱ";

                this.SuspendLayout();

                //
                // richTextBox1
                //
                this.richTextBox1 = new System.Windows.Forms.RichTextBox();
                this.richTextBox1.BorderStyle = System.Windows.Forms.BorderStyle.None;
                this.richTextBox1.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte) (0)));
                this.richTextBox1.Location = new System.Drawing.Point(25, 80);
                this.richTextBox1.Name = "richTextBox1";
                this.richTextBox1.Size = new System.Drawing.Size(260, 103);
                this.richTextBox1.TabIndex = 0;
                this.richTextBox1.Text = unicodeText;

                //
                // label1
                //
                this.label1 = new System.Windows.Forms.Label();
                this.label1.BackColor = System.Drawing.Color.White;
                this.label1.Font = new System.Drawing.Font("Verdana", 8.25F);
                this.label1.Location = new System.Drawing.Point(309, 80);
                this.label1.Name = "label1";
                this.label1.Size = new System.Drawing.Size(260, 103);
                this.label1.TabIndex = 1;
                this.label1.Text = unicodeText;

                //
                // textBox1
                //
                this.textBox1 = new System.Windows.Forms.TextBox();
                this.textBox1.Font = new System.Drawing.Font("Verdana", 8.25F);
                this.textBox1.Location = new System.Drawing.Point(591, 80);
                this.textBox1.Multiline = true;
                this.textBox1.Name = "textBox1";
                this.textBox1.Size = new System.Drawing.Size(260, 103);
                this.textBox1.TabIndex = 2;
                this.textBox1.Text = unicodeText;
           
                //
                // Form1
                //
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.ClientSize = new System.Drawing.Size(883, 222);
                this.Controls.Add(this.label4);
                this.Controls.Add(this.label3);
                this.Controls.Add(this.label2);
                this.Controls.Add(this.textBox1);
                this.Controls.Add(this.label1);
                this.Controls.Add(this.richTextBox1);
                this.Name = "Form1";
                this.Text = "Form1";
                this.ResumeLayout(false);
                this.PerformLayout();
            }
        }
    }

    Freitag, 21. Januar 2011 12:19
  • Hallo Michael,

    Hier die unterstützten Unicode-Zeichen bei Verdana:

    [Unicode characters supported by the Verdana font]
    http://www.fileformat.info/info/unicode/font/verdana/list.htm
    (die von Dir gewünschten arabischen Zeichen sind nicht dabei).

    • "Verdana (v. 2.43) uses an incorrect position for combining diacritical marks, causing them to display on the following character instead of the preceding. This makes it unsuitable for Unicode-encoded text such as Cyrillic or Greek.
      [Verdana - Wikipedia, the free encyclopedia]

     


    ciao Frank
    Freitag, 21. Januar 2011 12:25
  • wieso funktioniert das Ganze dann mit einer TextBox und einem Label?
    Michael,
    ich kann inzwischen genau dies mit .NET RichTextBox  (zeigt Quadrate) auch nachvollziehen...

    Ich denke es gibt da unter den Controls unterschiedliche Fallback/Substitution Regeln;
    evtl. nicht zuletzt weil RichTextBox ein native Win32 Control ist (und eh spezielles RTF Font-Handling!),
    aber TextBox & Label AFAIK eher zur Seite .NET Graphics / GDI+ Font Rendering tendieren.

    Ich würde empfehlen, dass du hier besser nur Fonts einsetzt, die auch wirklich Arabic unterstützen.
    Freitag, 21. Januar 2011 12:25
  • Gibt es da Fallbacks?

    Michael,
    (viele) Details würde man wohl auch in den zahlreichen Blogs von Michael Kaplan [MS] finden
    Font substitution and linking
    http://blogs.msdn.com/b/michkap/archive/2005/03/20/399322.aspx
    http://blogs.msdn.com/b/michkap/archive/2006/01/22/515864.aspx

    MSDN grob
    http://msdn.microsoft.com/en-us/goglobal/bb688134

    ist aber weitestgehend wohl kein wirkliches .NET-Thema mehr.

    Freitag, 21. Januar 2011 12:36
  • und der Unterschied einer RichText zu TextBoxen ist (diesbzgl.), dass das Zeichnen von TextBoxen letztlich an Windows delegiert wird (bei einer RichtTextBox kannst Du z.B. OnPaint sinnvoll behandeln), sodass auch Custom Painting schwer bei TextBoxen zu implementieren ist.

    [Text Rendering accuracy problem in TextBox/RichTextBox]
    http://www.dotnetmonster.com/Uwe/Forum.aspx/winform-controls/5552/Text-Rendering-accuracy-problem-in-TextBox-RichTextBox

    [Creating a Graphical Editor Using RichTextBox and GDI+]
    http://msdn.microsoft.com/en-us/magazine/cc188731.aspx


    ciao Frank
    Freitag, 21. Januar 2011 12:36
  • Ich würde empfehlen, dass du hier besser nur Fonts einsetzt, die auch wirklich Arabic unterstützen.


    Das muss ich jetzt nur noch dem Kunden beibringen, der will nämlich Verdana - weil's so schön ist :-)

     

    Vielen Dank Euch beiden für die schnelle Hilfe!

     

    Beste Grüße,

    Michael

    Freitag, 21. Januar 2011 12:38
  • dem Kunden beibringen, der will nämlich Verdana - weil's so schön ist :-)

    Michael,
    meinte nun der Kunden damit seine arabischen Zeichen?   (oder alle/ASCII?)
    Denn mit der Fallback-Sache hat er eigentlich eben gar nie (arabische) Verdana Glyphs gesehen, sondern eben diejenigen eines Ausweich-Fonts  (zB Arial Unicode usw)!
    Du müsstest jetzt halt wohl mit genannter MSDN/Blog (Registry)
    oder 'optische Vergleiche' herausfinden, welcher Font eigentlich angezeigt wurde.
    Freitag, 21. Januar 2011 12:46
  • Hallo Thomas,

         > ... ist aber weitestgehend wohl kein wirkliches .NET-Thema mehr.

    Die reine Fontsubstitution ACK, aber das Thema "RichTextBox wird anders gezeichnet als TextBox" hat schon "auch" was mit .NET zu tun, da wir hier einen Unterschied GDI und GDI+ haben. Aus meinen Links u.a. dazu etwa:

    [Warum wird Text mit GDIPlus im Vergleich zu GDI gezeichnet anders]
    http://support.microsoft.com/kb/307208

    Aber das hast Du höchstwahrscheinlich in die Formulierung "weitestgehend" mit eingeschlossen.


    ciao Frank
    Freitag, 21. Januar 2011 12:52
  • Frank,
    dass GDI+ im Spiel ist habe ich längst erwähnt, bitte genauer lesen und ich habe kein Diskussionsbedarf.
    Freitag, 21. Januar 2011 12:54
  • Thomas,

    das hast Du falsch verstanden (bitte genauer lesen), es geht nur darum, dass hier nicht falsche Schluss gezogen werden darf, das hätte nichts mit .NET zu tun.

    Das es eins ist, zeigt u.a. die Referenz:

    [Warum wird Text mit GDIPlus im Vergleich zu GDI gezeichnet anders]
    http://support.microsoft.com/kb/307208


    ciao Frank
    Freitag, 21. Januar 2011 13:00