2017-09-10 1 views
-1

Mon programme C# prend la saisie de texte de l'utilisateur et crée une requête Web à Wikipedia pour des suggestions, puis affiche les suggestions à ListView dessiné par le propriétaire à l'aide de la fonction Win32 API ExtTextOut.Comment faire ExtTextOut afficher correctement pour le caractère vietnamien

Quelques suggestions en reviennent encodées, comme ceci:

Abridged Chronicles of \\u0110\\u1ea1i Vi\\u1ec7t 

donc je les décodées en utilisant System.Text.RegularExpressions.Regex.Unescape

pour produire ceci:

Abridged Chronicles of Đại Việt 

Bien que la chaîne ci-dessus avec ses littérales caractères vietnamiens rend bien dans un TextBox, RichTextBox et n'importe où dans le débogueur de Visual Studio, il ne rend pas correctement en envoyé par ExtTextOut.

Voici à quoi il ressemble:

enter image description here

J'ai essayé de changer ma déclaration DllImport pour ExtTextOut utiliser la version W:

[DllImport("gdi32.dll", EntryPoint = "ExtTextOutW")] 
public static extern int ExtTextOut(IntPtr hdc, int x, int y, int options, 
    ref RECT clip, String str, int len, IntPtr spacings); 

mais qui vient de rendre des caractères asiatiques pour toutes les sorties. J'ai regardé dans les options de langue sur mon ordinateur Windows mais cela ne semble pas être le bon endroit pour corriger le problème car RichTextBox peut rendre les caractères très bien (ainsi que Visual Studio et mon navigateur Web lors de la navigation sur Wikipedia, d'ailleurs).

J'ai essayé de convertir la chaîne, comme ceci:

byte[] utf8Bytes = Encoding.UTF8.GetBytes(str); 
byte[] unicodeBytes = Encoding.Convert(Encoding.UTF8, Encoding.Unicode, utf8Bytes); 
str = Encoding.Unicode.GetString(unicodeBytes); 

mais qui ne rien faire et je ne suis pas surpris, étant donné que (corrigez-moi si je me trompe) dans .NET, une chaîne en mémoire est toujours encodé avec UTF-16, donc le code ci-dessus n'a vraiment rien fait.

Comment est-il possible d'utiliser ExtTextOut pour afficher les caractères correctement ou ai-je besoin d'une approche différente?

+0

Quel est le point d'utiliser 'ExtTextOut()'? Vous pouvez utiliser 'Graphics.DrawString()' ou 'TextRenderer' dans .NET pour faire la même chose. Si vous voulez de l'aide avec du code qui ne fonctionne pas, vous devez fournir un bon [mcve] qui reproduit fidèlement votre problème. –

+0

Est-ce moi ou est-ce que les membres de ce site répondent parfois avec plus de critiques que nécessaire, malgré tous leurs efforts? Je pensais avoir fourni assez pour continuer, mais je ne connaissais pas cette page, alors merci pour cela. Je vais modifier la question et les améliorer à l'avenir. Pour le choix des fonctions, j'ai écrit le code de rendu de texte il y a plusieurs années et je crois qu'il y avait un problème avec 'Graphics.DrawString()' et avec 'TextRenderer' mais je vais revoir et voir. –

Répondre

0

Eh bien, on dirait que la solution était d'ajouter Charset = Charset.Unicode:

[DllImport("gdi32.dll", CharSet = CharSet.Unicode, EntryPoint = "ExtTextOutW")] 
public static extern int ExtTextOut(IntPtr hdc, int x, int y, int options, ref RECT clip, 
    String str, int len, IntPtr spacings);