字体是对的。为什么我不能让这个 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
我在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