字体是对的。为什么我不能让这个 unicode 字符显示在这个 C# 控制台应用程序中?

Font is right. Why can't I get this unicode character to display in this C# console app?

我在cmd中添加了字体。 (DejaVu Sans Mono)这个 techrepublic link 有注册表 hack 可以将字体添加到 cmd,可以为某些字体做到这一点,例如那个。

该字体有一个 unicode 非 ascii 字形,我可以将该 unicode 非 ascii 字形粘贴到 cmd 提示符中

但是我从标准输入读取的 C# 程序没有输出它

这是我的 C# 程序及其输出

我的程序从 stdin 读取一行,然后写入。

问题是它写的时候写了一个问号

程序甚至有这行

Console.OutputEncoding = System.Text.Encoding.Unicode;

但即使使用该行也无法输出字符

C:\blah>echo ⬕
⬕

C:\blah>type b1.cs
using System;
class Program
{
    static void Main(string[] args)
    {
        Console.OutputEncoding = System.Text.Encoding.Unicode;
        string s;
        s = Console.ReadLine();
        Console.WriteLine(s);

    }
}
C:\blah>b1
⬕
?

C:\blah>

我知道我很好,因为 more 有同样的问题..但是 echo 可以做到,所以我应该可以让我的程序做到这一点

C:\blah>echo ⬕
⬕

C:\blah>more
⬕
?

^C
C:\blah>

添加了关于 cyril 评论的截图

已添加截图重新..评论

一个 C# 程序只有一行 Console.WriteLine("⬕") 写入 ? 它被保存为 unicode 以保留该字符,并编译。但是考虑到它打印了一个 ?,似乎损坏发生在输出上。我不能完全评论损坏是否也发生在标准输入上。但看起来它发生在输出上。

您还需要设置输入编码。

Console.InputEncoding = System.Text.Encoding.Unicode;

已更新!

using System;
class Program
{
    static void Main(string[] args)
    {
        Console.OutputEncoding = System.Text.Encoding.Unicode;
        Console.InputEncoding = System.Text.Encoding.Unicode;
        string s;
        s = Console.ReadLine();
        Console.WriteLine(s);

    }
}

正如 Htin 所说,您必须更改输入编码。我想进一步说明这一点

当您执行 chcp num 时,它会更改输入和输出编码。当你执行 chcp 时,它只显示输入编码

C:\>chcpa
Input encoding is: 862- Hebrew (DOS)
Output encoding is: 862- Hebrew (DOS)
To change encoding, use chcpa 850 or chcpa i 850 or chcpa o 850 or chcpa io 850
For fuller and further options, use chcpa  /?

C:\>chcpa o 850
Input encoding is now: 862- Hebrew (DOS)
Output encoding is now: 850- Western European (DOS)

C:\>chcp
Active code page: 862

C:\>chcpa i 65001
Input encoding is now: 65001- Unicode (UTF-8)
Output encoding is now: 850- Western European (DOS)

C:\>chcp
Active code page: 65001

C:\>

这个小程序 chcpa.csc / chcpa.exe 可以让您更改输入或输出编码,或两者都更改

可在此处下载 EXE

http://ge.tt/api/1/files/4PHsTRN2/0/blob?download

或者您可以从源代码编译它

// this program allows setting of input and output codepages..
// and this program can show how chcp<ENTER> checks only the input codepage
// and chcp 850 or chcp num, changes both the input and output codepages

class chcpautility
{
 static string progname=System.AppDomain.CurrentDomain.FriendlyName;


static void Main(string[] args)
{

progname=progname.Substring(0,progname.Length -4);

if (args.Length==0)
{
   // these aren't equivalent oddly enough System.Console.InputEncoding.WindowsCodePage+"- "+System.Console.InputEncoding.EncodingName);

   System.Console.WriteLine("Input encoding is: "+System.Console.InputEncoding.CodePage+"- "+System.Console.InputEncoding.EncodingName);
   System.Console.WriteLine("Output encoding is: "+System.Console.OutputEncoding.CodePage+"- "+System.Console.OutputEncoding.EncodingName);

   //System.Console.WriteLine("To change encoding, use "+progname+" 850 or "+progname+" i 850 or "+progname+" o 850 or "+progname+" io 850 or chcpa -?"); 
   //prog io 850 is the same as prog 850  

    printbasicusage();
}


if (args.Length==1 && (args[0]=="/?"|args[0]=="-?"|args[0]=="-h"|args[0]=="--help"))
{

  System.Console.WriteLine("progname num e.g. chcpa 850  to change both input and output encodings");
  System.Console.WriteLine("chcpa i 850  would change just the input encoding");
  System.Console.WriteLine("chcpa o 850  would change just the output encoding");
  System.Console.WriteLine("chcpa io 850  would change both input and output encodings. That's the same as chcpa 850");
  System.Console.WriteLine("chcpa<ENTER> will display current encodings");
  System.Console.WriteLine("chcpa showencodings  <-- will list encodings, you can add to the list by editing this source code");

 System.Environment.Exit(1);

}

if (args.Length==1 && (args[0]=="showencodings" | args[0]=="showencoding")) 
{

// from here
// https://msdn.microsoft.com/en-us/library/system.text.encoding(v=vs.110).aspx

System.Console.WriteLine("850   ibm850      Western European (DOS)");
System.Console.WriteLine("852   ibm852      Central European (DOS)");
System.Console.WriteLine("862   DOS-862     Hebrew (DOS)  (Can use Courier New for Hebrew)"); 
System.Console.WriteLine("1146  IBM01146    IBM EBCDIC (UK-Euro)");
System.Console.WriteLine("1200  utf-16      Unicode (Can use DejaVu Sans Mono, or Droid Sans Mono for Unicode)"); 
System.Console.WriteLine("1201  unicodeFFFE Unicode (Big endian) (Can use DejaVu Sans Mono, or Droid Sans Mono for Unicode)"); 
System.Console.WriteLine("1252  Windows-1252    Western European (Windows)");
System.Console.WriteLine("1255  windows-1255    Hebrew (Windows)");
System.Console.WriteLine("12000 utf-32      Unicode (UTF-32) (Can use DejaVu Sans Mono, or Droid Sans Mono for Unicode)"); 
System.Console.WriteLine("12001 utf-32BE    Unicode (UTF-32 Big endian) (Can use DejaVu Sans Mono, or Droid Sans Mono for Unicode)"); 
System.Console.WriteLine("20127 us-ascii    US-ASCII");
System.Console.WriteLine("20285 IBM285      IBM EBCDIC (UK)");
System.Console.WriteLine("20424 IBM424      IBM EBCDIC (Hebrew) (Can use Courier New for Hebrew)"); 
System.Console.WriteLine("65000 utf-7       Unicode (UTF-7) (Can use DejaVu Sans Mono, or Droid Sans Mono for Unicode)"); 
System.Console.WriteLine("65001 utf-8       Unicode (UTF-8) (Can use DejaVu Sans Mono, or Droid Sans Mono for Unicode)"); 
 System.Environment.Exit(1);

}




if (args.Length==1)
{
  //System.Text.Encoding ei=System.Console.InputEncoding;  //so can later say what it was
  //System.Text.Encoding eo=System.Console.OutputEncoding; //so can later say what it was

  System.Console.InputEncoding=System.Text.Encoding.GetEncoding(int.Parse(args[0]));
  System.Console.OutputEncoding=System.Text.Encoding.GetEncoding(int.Parse(args[0]));

   //System.Console.WriteLine("Input encoding was: "+ei.CodePage+"- "+ei.EncodingName);
   //System.Console.WriteLine("Output encoding was: "+eo.CodePage+"- "+eo.EncodingName);


   System.Console.WriteLine();

   System.Console.WriteLine("Input encoding is now: "+System.Console.InputEncoding.CodePage+"- "+System.Console.InputEncoding.EncodingName);
   System.Console.WriteLine("Output encoding is now: "+System.Console.OutputEncoding.CodePage+"- "+System.Console.OutputEncoding.EncodingName);

}
if (args.Length==2) 
{
//System.Console.WriteLine("Usage- prog i o num e.g. prog i 850 or prog o 850 or prog io 850");

  //System.Text.Encoding ei=System.Console.InputEncoding;  //so can later say what it was
  //System.Text.Encoding eo=System.Console.OutputEncoding; //so can later say what it was

 if (args[0]=="i") System.Console.InputEncoding=System.Text.Encoding.GetEncoding(int.Parse(args[1]));
 if (args[0]=="o") System.Console.OutputEncoding=System.Text.Encoding.GetEncoding(int.Parse(args[1]));
 if (args[0]=="io") {
  System.Console.InputEncoding=System.Text.Encoding.GetEncoding(int.Parse(args[1]));
  System.Console.OutputEncoding=System.Text.Encoding.GetEncoding(int.Parse(args[1]));
 }


   //System.Console.WriteLine("Input encoding was: "+ei.CodePage+"- "+ei.EncodingName);
   //System.Console.WriteLine("Output encoding was: "+eo.CodePage+"- "+eo.EncodingName);


   //System.Console.WriteLine();

   System.Console.WriteLine("Input encoding is now: "+System.Console.InputEncoding.CodePage+"- "+System.Console.InputEncoding.EncodingName);
   System.Console.WriteLine("Output encoding is now: "+System.Console.OutputEncoding.CodePage+"- "+System.Console.OutputEncoding.EncodingName);


//System.Console.OutputEncoding=System.Text.Encoding.GetEncoding(65001);


} //if


if (args.Length>2) {System.Console.WriteLine("Too many parameters, check usage, try chcpa<ENTER>");}

} //main

public static void printbasicusage()
{
   System.Console.WriteLine("To change encoding, use "+progname+" 850 or "+progname+" i 850 or "+progname+" o 850 or "+progname+" io 850"); 
   //prog io 850 is the same as prog 850  
   System.Console.WriteLine("For fuller and further options, use " + progname + "  /?");

} //printbasicusage()

} //class