在C#控制台应用程序中显示阿拉伯字符

19

我相信在13年前的Windows ME时代,可以在控制台应用程序中显示阿拉伯字符。

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

????? ??

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

有没有办法在控制台输出中显示阿拉伯字符?


2
这个在13年前能够正常工作是因为当时还没有Console类来搞砸它 :) 现在出错了是因为你改变了OutputEncoding。不要碰它,应该将其设置为阿拉伯机器上的阿拉伯代码页或utf8。在非阿拉伯机器上,你会发现很难找到一个能够显示字形的控制台字体。 - Hans Passant
3个回答

27

要使这个工作起来,需要解决几个问题。

  • 你需要一种支持阿拉伯语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 / 7/8中,这是对.ttf文件进行右键单击,安装)。完成后,您必须按照KB中的说明操作。

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

enter image description here

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

enter image description hereenter image description here

结果。

enter image description here

...所以经过所有这些,我们发现控制台不支持从右到左的语言。 我想您可以使用类似于以下函数:

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


剩下的阿拉伯文本问题应该使用适当的造型算法来解决。 - Ho1
你提供的“控制台不支持从右到左的语言”链接,实际上是说“控制台应用程序不包括双向语言的文本支持”,这与不支持阿拉伯语等从右到左的语言完全不同(例如混合英语(LTR)和阿拉伯语(RTL))。它并没有说明不支持从右到左的语言,如阿拉伯语。 - skomisa
@skomisa 自四年前回答此问题以来,文档已经发生了变化。意思仍然相同 - 控制台不支持除从左到右之外的文本输出。微软在新文档中的术语有些含糊 - 他们所谓的“双向”是指输入方向与从左到右不同的语言。 - J...
@J...实际上,我引用的是您从提供的下拉列表中链接到的旧版本文档,并且那部分内容没有改变。但如果您是正确的,那么微软的做法就不仅仅是粗心大意了,因为“双向”和RTL有非常精确和质量不同的含义。除此之外,这意味着使用阿拉伯语(或波斯语或希伯来语或乌尔都语)的Windows用户无法使用命令提示窗口。虽然我不确定,但这似乎极不可能。 - skomisa
@skomisa 很可能不只是猜测——这是事实。控制台从未支持RTL语言。几十年来,英语偏见在计算机系统中相当普遍——直到最近才开始改变。 - J...
该文本可以被反转,也可以使用在线工具进行分割,显示为 ﮏﺑ ﺎﺒﺣﺮﻣ,以便结果更像 مرحبا بک 而不是 م‌ر‌ح‌ب‌ا ب‌ک - iѕєρєня

0

您可以使用简单的ASP .NET Core并在浏览器中预设您的数据

  context.Response.ContentType = "text/plain; charset=utf-8";
  await context.Response.WriteAsync("بسم الله الرحمن");

enter image description here


-1

由于这里的答案无法解决您的问题,我会发布一个备用方案,可能有助于测试。

如果您可以使用WPF项目而不是控制台应用程序,则可以:

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

创建一个WPF项目,并向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设置为拉伸以填满整个窗口。

您可以在代码部分添加一个方法来方便向该文本框中添加字符串,该方法可以如下所示:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接