我有几种情况需要在Windows控制台中打印Unicode字符,在C#和Visual Basic中编程。中国人正在成为一个问题。
我已尝试在MSDN和StackOverflow here和here上找到答案。我也读过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及更高版本),无需下载和安装额外的组件(例如,额外的字体)。