2009-07-23 5 views
2

In einigen RightToLeft Sprachen (wie Arabisch, Persisch, Urdu, usw.) kann jeder Buchstabe unterschiedliche Formen haben. Es gibt eine isolierte Form, eine anfängliche Form und eine mittlere Form (Sie können sie einfach auf der Zeichentabelle der Fenster für jede Unicode-Schriftart finden).Wie bekomme ich die Zeichen für die kontextförmige Eingabe in einem komplexen Skript?

Stellen Sie sich vor, Sie benötigen die genauen Zeichen, die der Benutzer in einem Textfeld eingegeben hat, wenn Sie die Zeichenfolge in CharArray konvertieren, wird jedes Zeichen in isolierte Form konvertiert.

(weil, wenn Benutzer die Zeichen per Tastatur eingeben, ist es in der isolierten Form und wenn es auf dem Bildschirm angezeigt wird, wird es in das richtige Format konvertiert; das ist nur eine Vermutung. Denn wenn Sie die Zeichenfolge Durch Verwendung von exakten Zeichencodes wird das richtige Array erzeugt.

Meine Frage ist, wie wir diese Form der Zeichenfolge erhalten können, das Formular, das in der Textbox angezeigt wurde.

Wenn es in .NET keine Möglichkeit gibt, dann bedeutet dies, ich brauche, um meine eigene Klasse zu machen dieses T_T konvertieren

+0

Ich habe gerade dieses Problem gelöst. Siehe http://www.cheraq.com/post/2009/08/06/Text-to-image-converter-and-Complex-Scripts-Awareness.aspx –

Antwort

3

Windows verwendet Uniscribekontextuelle auszuführen für komplexe Skripte Gestaltung (die l-to-r gelten können sowie r-to-l Sprachen). Der angezeigte Text in einem Textfeld basiert auf der Glypheninformation, nachdem die Zeichen in Uniscribe eingegeben wurden. Obwohl der Unicode-Standard Codepunkte für isolierte, initiale, mediale und finale Formen eines Zeichens definiert, unterstützen nicht alle Zeichensätze diese, obwohl sie vorgeformte Glyphen haben oder eine Kombination von Glyphen verwenden - Uniscribe verwendet eine Shaping-Engine aus das Windows-Sprachpaket, um zu bestimmen, welche Glyphe (n) verwendet werden sollen, basierend auf der cmap der Schriftart.Hier sind einige relevante Links:

Die TextRenderer .DrawText() Methode verwendet Uniscribe über die Win32 DrawTextExW() Funktion, die folgenden P/Invoke verwendet:

[DllImport("user32.dll", CharSet=CharSet.Unicode, SetLastError=true)] 
public static extern int DrawTextExW(HandleRef hDC 
            ,string lpszString 
            ,int nCount 
            ,ref RECT lpRect 
            ,int nFormat 
            ,[In, Out] DRAWTEXTPARAMS lpDTParams); 

[StructLayout(LayoutKind.Sequential)] 
public struct RECT 
{ 
    public int left; 
    public int top; 
    public int right; 
    public int bottom; 
} 

[StructLayout(LayoutKind.Sequential)] 
public class DRAWTEXTPARAMS 
{ 
    public int iTabLength; 
    public int iLeftMargin; 
    public int iRightMargin; 
    public int uiLengthDrawn; 
} 
+0

Danke für deine Antwort. Aber meine Frage ist, wie ich eingegebenen Text in den geformten Text konvertieren und das Ergebnis als Char-Array oder String erhalten kann. –

+0

Ich habe weitere Informationen über Uniscribe hinzugefügt und warum es nicht trivial ist, die Zeichen (Codepunkte) zu erhalten, die im Textfeld angezeigt werden. Es scheint, dass Sie nur Uniscribe verwenden können, indem Sie Indizes in Schrift-Cmaps nachschlagen oder Ihre eigene Shaping-Information-Engine erstellen. –

0

Also, wie Sie das „falsche“ string zu schaffen? Wenn Sie es nur in ein String-Literal schreiben, ist es wahrscheinlich, dass es nur die Eingabemethode ist, die falsch ist. Wenn Sie die "richtige" Zeichenfolge nach dem Anzeigen kopieren und dann in ein Zeichenfolgenliteral einfügen, was passiert dann? Sie sollten auch überprüfen, welche Codierung Visual Studio für Ihre Quelldateien verwendet. Wenn Sie nicht die Zeichenfolge in Ihren Quellcode als Literal setzen, wie erstellen Sie es?

die Möglichkeit verwirrend Da denke ich, dass ich entweder auf diese Zeichenfolgen in einer Ressource halten wollen würde, oder sie hart Code Unicode Entkommen:

string text = "\ufb64\ufea0\ufe91\feea"; 

(möglicherweise dann danach, welche die nicht einen Kommentar setzen -Escaped Wert, zumindest dann, wenn es richtig aussieht, wird es nicht auch irreführend sein .. Zugegeben, es ist dann einfach für die beiden aus der Synchronisation geraten ...)

+0

Die Eingabezeichenfolge stammt von der Benutzereingabe und ist nicht statisch . Es ist zum Beispiel der Titel einer Seite oder eines Menüs. Es kann also nicht hart codiert werden. Sie können Ereignis versuchen, indem Sie TextBox-Steuerelement verwenden, und Sie werden dasselbe Ergebnis erhalten. –

+0

Richtig, in diesem Fall ist es eine Einschränkung der Eingabemethode. Sie * finden *, dass das Ändern der Schriftart der TextBox hilft ... Ich bin mir nicht sicher. Ich werde sehen, ob ich genug Schriftarten usw. installiert habe, um es zu überprüfen. –

+0

Ich denke, das passiert, weil wenn Sie den Text eingeben, indem Sie die Tastatur verwenden, wird es das Standardzeichen eingeben, das die isolierte Form ist, aber auf dem Textfeld wird Windows es in die richtige Form auf dem Display konvertieren. –

0

Dies ist ein bisschen wie wild rate, aber hilft String.Normalize() hier? Es ist mir unklar, ob das nur die Charakterzusammensetzung betrifft oder ob es auch Positionsformen beinhaltet.

+0

Eigentlich habe ich das auch probiert, aber kein Ergebnis T_T –

Verwandte Themen