在C#console应用程序中显示阿拉伯字符

时间:2014-02-13 10:40:49

标签: c# unicode console-application arabic

我相信自从Windows ME诞生以来,13年多以前就可以在控制台应用程序上显示阿拉伯字符。

现在我正在使用Visual Studio 2013,在Windows 8上,以下代码显示:

  

????? ??

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

无论如何在控制台输出中显示阿拉伯字符?

2 个答案:

答案 0 :(得分:19)

要解决此问题需要解决几个问题。

  • 您需要一种支持阿拉伯语 AND Windows控制台的字体。

请参见知识库:Necessary criteria for fonts to be available in a command window

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,这是支持阿拉伯语的少数几个之一。阿拉伯语是制作单色字体的一种强硬语言,因为语言的美学效果不适合每个字符的固定宽度。不过,这种字体是一种诚实的努力。有关其他可能的替代方案,请参阅:

complete, monospaced Unicode font?

必须以正常方式为您的Windows版本安装字体(在Vista / 7/8中,这是.ttf文件中的right-click, Install)。完成此操作后,您必须按照KB中的说明进行操作。

  1. 注册表编辑器 - > HKLM \ Software \ Microsoft \ WindowsNT \ CurrentVersion \ Console \ TrueTypeFont
  2. 添加名为“000”的新字符串值,其值为DejaVu Sans Mono
  3. 重新启动
  4. enter image description here

    重新启动后,您可以通过从控制台菜单中选择“属性”并在“字体”选项卡中更改字体来更改控制台中的字体。

    enter image description here enter image description here

    结果。

    enter image description here

    ...毕竟,我们发现console does not support Right-To-Left languages.我想你可以使用像这样的函数:

    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("مرحبا بك"));
    

    enter image description here

答案 1 :(得分:0)

由于这里的答案并不能解决您的问题。我发布了一个可能有助于测试内容的备用解决方法。

如果您可以使用WPF项目而不是控制台应用程序,那么您将能够:

  • 在屏幕上查看阿拉伯文字。
  • 滚动执行的整个输出
  • 轻松复制输出
  • 继续使用C#作为编码语言

创建WPF项目并向具有以下属性的WPF设计添加multiligne textBox:

<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用于具有多行textBox。 Horizo​​ntalAlignment和VerticalAlignment设置为拉伸以填充所有显示的窗口。

你可以在代码部分添加一个方法来简化在这个textBox中添加String的方法,方法可以是这样的:

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

全局代码behing将是:

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 textBox中。 这是执行结果http://i.imgur.com/d0jql3z.png

的屏幕截图

您可以通过更改textBox属性来调整显示,字体,样式,大小等内容都可以自定义。