C#和VB:Windows控制台中的Unicode字符

时间:2017-06-26 11:27:27

标签: c# .net unicode console

我有几种情况需要在Windows控制台中打印Unicode字符,在C#和Visual Basic中编程。中国人正在成为一个问题。

我已尝试在MSDN和StackOverflow herehere上找到答案。我也读过Joel on Software。但是我想我在2003年读过那篇文章,而且今天与我的问题并不完全相关。

这是一些示例代码;它实际上与微软提出的相同,但略微修改后显示中文和希腊文。

using System;
using System.Text;

class Example
{
    static void Main()
    {
        string unicodeString = "This string contains some Chinese (福更斯)";
        string unicodeString2 = "This string contains some Greek (Αλφάβητο)";

        // Create two different encodings.
        Encoding ascii = Encoding.ASCII;
        Encoding unicode = Encoding.Unicode;

        // Convert the strings into  byte arrays.
        byte[] unicodeBytes = unicode.GetBytes(unicodeString);
        byte[] unicodeBytes2 = unicode.GetBytes(unicodeString2);

        // Perform the conversion from one encoding to the other.
        byte[] asciiBytes = Encoding.Convert(unicode, ascii, unicodeBytes);
        byte[] asciiBytes2 = Encoding.Convert(unicode, ascii, unicodeBytes2);

        // Convert the new byte[] into a char[] and then into a string.
        char[] asciiChars = new char[ascii.GetCharCount(asciiBytes, 0, asciiBytes.Length)];
        ascii.GetChars(asciiBytes, 0, asciiBytes.Length, asciiChars, 0);
        string asciiString = new string(asciiChars);

        char[] asciiChars2 = new char[ascii.GetCharCount(asciiBytes2, 0, asciiBytes2.Length)];
        ascii.GetChars(asciiBytes2, 0, asciiBytes2.Length, asciiChars2, 0);
        string asciiString2 = new string(asciiChars2);



        // Display the strings created before and after the conversion.
        Console.WriteLine("Original string: {0}", unicodeString);
        Console.WriteLine("Ascii converted string: {0}", asciiString);

        Console.WriteLine("Original string: {0}", unicodeString2);
        Console.WriteLine("Ascii converted string: {0}", asciiString2);
    }
}
// The example displays the following output:
//    Original string: This string contains some Chinese (福更斯)
//    Ascii converted string: This string contains some Chinese (???)
//    Original string: This string contains some Greek(Αλφάβητο)
//    Ascii converted string: This string contains some Greek(????????)

(改编自https://docs.microsoft.com/en-us/dotnet/api/system.text.encoding?view=netframework-4.7

我在Visual Studio 2017中编译它,目标是.NET 4.5.2。 我用cmd / K chcp 65001启动一个控制台。当我运行.exe时,这就是我所看到的:

Original string: This string contains some Chinese (☒☒☒)
Ascii converted string: This string contains some Chinese (???)
Original string: This string contains some Greek (Αλφάβητο)
Ascii converted string: This string contains some Greek (????????)

在这里,我使用☒来表示我在控制台中看到的内容,这是一个框中的问号。如果我复制我在控制台中看到的内容,我会得到中文...

控制台使用Consolas,在记事本中,此字体正确显示中文。但是在控制台中,为了正确地看到中文,我需要将字体切换为MS Gothic或NSimSum,但在这种情况下,希腊语是非常糟糕的(字符间距比它们应该更远)。

是否有一种简单可靠的方法让控制台显示中文?

当代码完成后,它将作为示例分发给第三方,因此我还需要能够解释一个简单的解决方案,以正确显示文本,这应该几乎100%的工作案例(Windows 10,Visual Studio 2017,.NET 4.5及更高版本),无需下载和安装额外的组件(例如,额外的字体)。

0 个答案:

没有答案