Отображение арабских символов в консольном приложении C #

c# unicode console-application arabic

15018 просмотра

2 ответа

Я считаю, что было возможно показать арабские символы в консольном приложении 13+ лет назад, со времен Windows ME.

Теперь я использую Visual Studio 2013, на Windows 8, и следующий код показывает:

????? ??

   Console.OutputEncoding = System.Text.Encoding.Unicode;
   Console.WriteLine("مرحبا بك");

Есть ли вообще вывод арабских символов в вывод консоли?

Автор: Alaa Источник Размещён: 12.11.2019 09:25

Ответы (2)


19 плюса

Решение

Есть несколько проблем, которые нужно решить, чтобы заставить это работать.

  • Вам нужен шрифт, который поддерживает как арабский, так и консоль Windows.

См. KB: необходимые критерии для доступности шрифтов в командном окне.

The font must be a fixed-pitch font.
The font cannot be an italic font.
The font cannot have a negative A or C space.
If it is a TrueType font, it must be FF_MODERN.
If it is not a TrueType font, it must be OEM_CHARSET.
  • Вы должны установить шрифт.

Для тестирования я использовал DejaVu Mono , один из немногих, который поддерживает арабский язык. Арабский язык является жестким языком для создания шрифта с монотипом, так как эстетика языка плохо работает с фиксированной шириной для каждого символа. Тем не менее, этот шрифт делает честное усилие. Для других возможных альтернатив см .:

полный, моноширинный шрифт Unicode?

Шрифт должен быть установлен обычным способом для вашей версии Windows (в Vista / right-click, Install7/8 это в файле .ttf). Как только это будет сделано, вы должны следовать указаниям в КБ.

  1. Редактор реестра -> HKLM \ Software \ Microsoft \ WindowsNT \ CurrentVersion \ Console \ TrueTypeFont
  2. Добавьте новое строковое значение с именем " 000" со значениемDejaVu Sans Mono
  3. перезагрузка

введите описание изображения здесь

После перезагрузки вы можете изменить шрифт в консоли, выбрав «Свойства» в меню консоли и изменив шрифт на вкладке «Шрифт».

введите описание изображения здесьвведите описание изображения здесь

Результат.

введите описание изображения здесь

... так что после всего этого мы обнаруживаем, что консоль не поддерживает языки справа налево. Я думаю, вы могли бы использовать функцию, такую ​​как:

static string Reverse(string text)
{
   if (text == null) return null; 
   char[] array = text.ToCharArray();
   Array.Reverse(array);
   return new String(array);
}

а затем сделать

Console.OutputEncoding = System.Text.Encoding.Unicode;
Console.WriteLine(Reverse("مرحبا بك"));

введите описание изображения здесь

Автор: J... Размещён: 13.02.2014 12:10

0 плюса

Поскольку ответ здесь не решает вашу проблему. Я публикую альтернативный обход, который может помочь при тестировании.

Если вы можете использовать проект WPF вместо консольного приложения, вы сможете:

  • Просмотр арабского текста на экране.
  • Прокрутите весь вывод вашего исполнения
  • Легко скопировать вывод
  • Продолжайте использовать C # в качестве языка кодирования

Создайте проект WPF и добавьте текстовое поле multitiligne в свой дизайн WPF со следующими свойствами:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <TextBox HorizontalAlignment="Stretch" AcceptsReturn="True"
             TextAlignment="Right"
             VerticalScrollBarVisibility="Auto"
             Name="textBox1" VerticalAlignment="Stretch"/>
</Grid>

TextAlignment вправо, как на арабском, VerticalScrollBarVisibility для просмотра всех выходных данных и AcceptsReturn для создания многострочного текстового поля. Установки HorizontalAlignment и VerticalAlignment растягиваются, чтобы заполнить все отображаемое окно.

Вы можете добавить метод в разделе кода, чтобы облегчить добавление String в этом textBox, метод может быть таким:

    private void writeToTextBox(string textToWrite)
    {
        textBox1.Text += textToWrite + "\n";
    }

Глобальная кодировка будет:

namespace WpfApplication1
{
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        createSourateFromXML();

    }
    private void createSourateFromXML()
    {
        string xmlquranfile = @"C:\Users\hp\Downloads\quran-simple.xml";

        XmlDocument xml_quran = new XmlDocument();
        xml_quran.Load(xmlquranfile);
        foreach (XmlNode soura in xml_quran.DocumentElement.ChildNodes)
        {
            writeToTextBox(soura.Attributes["name"].Value);
        }
    }
    private void writeToTextBox(string textToWrite)
    {
        textBox1.Text += textToWrite + "\n";
    }
}

Foreach перебирает имена в моем XML-файле и добавляет их в текстовое поле WPF. Это скриншот с результатом выполнения /files/images/464184.png

Вы можете настроить отображение, изменив свойства textBox, такие как шрифт, стиль, размер - все они настраиваются.

Автор: ploox Размещён: 09.01.2015 10:10
Вопросы из категории :
32x32