Как заставить ExtTextOut правильно отображать вьетнамский символ

Моя программа С# принимает текстовый ввод от пользователя и создает веб-запрос в Википедию для предложений, а затем выводит предложения на созданный владельцем ListView с помощью функции Win32 API функции ExtTextOut.

Некоторые предложения возвращаются в закодированном виде, например:

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

поэтому я их расшифровал с помощью System.Text.RegularExpressions.Regex.Unescape

для производства:

Abridged Chronicles of Đại Việt

Хотя приведенная выше строка со своими буквальными вьетнамскими символами отлично отображается в TextBox, RichTextBox и где угодно в отладчике Visual Studio, она не отображается правильно при отправке через ExtTextOut.

Вот как это выглядит:

enter image description here

Я попытался изменить свой оператор DllImport для ExtTextOut для использования версии 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);

но это просто отображает азиатские символы для всего вывода.

Я просмотрел параметры языка на своем компьютере под управлением Windows, но это не похоже на то, чтобы исправить проблему, потому что RichTextBox может отлично отображать символы (так что Visual Studio и мой веб-браузер при просмотре Википедии, если на то пошло),

Я попытался преобразовать строку, как это:

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

но это ничего не делало, и я не удивлен, учитывая, что (верьте, если я ошибаюсь) в.NET, строка в памяти всегда кодируется с помощью UTF-16, поэтому код выше действительно ничего не сделал.

Как можно использовать ExtTextOut для правильного отображения символов или мне нужен другой подход?

-1
источник поделиться
1 ответ

Ну, похоже, решение было добавить 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);
0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос