将非英语字符输入C#控制台应用程序时出现问题

将非英语字符输入C#控制台应用程序时出现问题,c#,visual-studio-2010,unicode,console-application,C#,Visual Studio 2010,Unicode,Console Application,我正在尝试在英文Windows7 Ultimate 64位上使用VisualStudio2010构建一个控制台C#应用程序。当我尝试复制带有非ASCII字符的路径,然后将其粘贴到我的控制台应用程序时,非ASCII字符会变成???。有办法解决这个问题吗 下面是我要复制的内容:C:\testfolder\Бцццццццц 这是代码(在上面建议的链接之后): 但是,即使我更改了字体,当我使用调试器测试变量时,strLineUserInput中的C:\Test Folder\ааааааааа仍然会变

我正在尝试在英文Windows7 Ultimate 64位上使用VisualStudio2010构建一个控制台C#应用程序。当我尝试复制带有非ASCII字符的路径,然后将其粘贴到我的控制台应用程序时,非ASCII字符会变成???。有办法解决这个问题吗

下面是我要复制的内容:
C:\testfolder\Бцццццццц

这是代码(在上面建议的链接之后):

但是,即使我更改了字体,当我使用调试器测试变量时,
strLineUserInput
中的
C:\Test Folder\ааааааааа
仍然会变为
C:\Test Folder???????

还要注意的是,与“复制帖子”链接不同,我需要输入这些字符

如果我这样做的话:

Console.InputEncoding = System.Text.Encoding.UTF8;
string strLineUserInput = Console.ReadLine();
如果我阅读了上面的文本,我的strLineUserInput将变为
null

遵循以下步骤:

  • 调试/不调试时,将控制台窗口字体更改为Lucida console
  • 执行以下代码:

    public static void Main(String[] args)
    {
        Console.OutputEncoding = System.Text.Encoding.GetEncoding("Cyrillic");
        Console.InputEncoding = System.Text.Encoding.GetEncoding("Cyrillic");
    
        Console.WriteLine(@"C:\Test Folder\документи");
        // input C:\Test Folder\документи
        string strLineUserInput = Console.ReadLine();
        Console.WriteLine(strLineUserInput);
    }
    
  • 输出应为:

    C:\Test Folder\документи
    C:\Test Folder\документи
    C:\Test Folder\документи
    
    [更新]

    也许您想使用
    ReadKey
    方法使其工作(您仍然需要使用Lucida Console字体):


    这对C#来说似乎是一种完全的矫枉过正,但对我来说却奏效了:

    using System.Runtime.InteropServices;
    
    [DllImport("kernel32.dll", SetLastError = true)]
    static extern IntPtr GetStdHandle(int nStdHandle);
    
    [DllImport("kernel32.dll")]
    static extern bool ReadConsoleW(IntPtr hConsoleInput, [Out] byte[]
        lpBuffer, uint nNumberOfCharsToRead, out uint lpNumberOfCharsRead,
        IntPtr lpReserved);
    
    public static IntPtr GetWin32InputHandle()
    {
        const int STD_INPUT_HANDLE = -10;
        IntPtr inHandle = GetStdHandle(STD_INPUT_HANDLE);
        return inHandle;
    }
    
    public static string ReadInputLineAsUTF8()
    {
        //I can't seem to find a way not to hardcode the size here???
        const int bufferSize = 1024 * 2;
        byte[] buffer = new byte[bufferSize];
    
        uint charsRead = 0;
        ReadConsoleW(GetWin32InputHandle(), buffer, bufferSize, out charsRead, (IntPtr)0);
    
        //Make new array of data read
        byte[] buffer2 = new byte[charsRead * 2];
        for (int i = 0; i < charsRead * 2; i++)
        {
            buffer2[i] = buffer[i];
        }
    
        //Convert string to UTF-8
        return Encoding.UTF8.GetString(Encoding.Convert(Encoding.Unicode, Encoding.UTF8, buffer2)).Trim();
    }
    
    使用System.Runtime.InteropServices;
    [DllImport(“kernel32.dll”,SetLastError=true)]
    静态外部IntPtr GetStdHandle(intnstdhandle);
    [DllImport(“kernel32.dll”)]
    静态外部bool ReadConsoleW(IntPtr hConsoleInput,[Out]字节[]
    lpBuffer,uint nNumberOfCharsToRead,out uint lpNumberOfCharsRead,
    IntPtr(保留);
    公共静态IntPtr GetWin32InputHandle()
    {
    const int STD_INPUT_HANDLE=-10;
    IntPtr inHandle=GetStdHandle(标准输入句柄);
    在处理中返回;
    }
    公共静态字符串ReadInputLineAsUTF8()
    {
    //我似乎找不到一种方法不在这里硬编码尺寸???
    常量int bufferSize=1024*2;
    字节[]缓冲区=新字节[bufferSize];
    uint charsRead=0;
    ReadConsoleW(GetWin32InputHandle(),buffer,bufferSize,out charsRead,(IntPtr)0);
    //读取新的数据数组
    byte[]buffer2=新字节[charsRead*2];
    对于(int i=0;i
    您的文本看起来像是俄语

    文件资源管理器使用Unicode

    控制台应用程序可能不是Unicode

    粘贴到控制台窗口时,Unicode字符将根据当前系统区域设置转换为非Unicode系统。如果您的系统区域设置不支持俄语,您的字符将转换为“?”

    尝试查看控制面板>区域和语言设置:

  • 打开控制面板
  • 选择区域和语言
  • 查看非Unicode的当前语言
  • 如果未设置为俄语,请尝试“更改系统区域设置”并设置为俄语

  • 如果您只想将输入副本粘贴到文本框中,这将非常容易。 在你的应用程序中有一个复选框控件,你可以用代码来改变你的字体

    enter code here
     private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBox1.Checked)
            {
                textBox1.Font = new Font("Your font", 10);
            }
            else 
            {
                textBox1.Font = new Font("Times New Roman", 10);
            }
        }
    

    或者,如果您始终粘贴非英语,则可以更改文本框的字体属性。

    下面的代码对我有帮助。请使用编码。Unicode而不是Encoding.UTF8

      Console.OutputEncoding = Console.InputEncoding = Encoding.Unicode;
      Console.Write("Введите свое имя: ");
      string name = Console.ReadLine(); 
      Console.WriteLine($"Привет {name}"); 
    

    是的,转到控制台窗口设置,并将字体更改为支持扩展字符的字体。Lucida console应该这样做。可能的重复您可以在问题中包括一些字符吗?您能否澄清将字符粘贴到何处?例如,它是作为inp进入C源代码还是作为inp进入控制台窗口ut在应用程序运行时发送到应用程序?@c00000fd-告诉我们为什么可能的复制没有帮助您,这将大大减少对复制的指控。我得到
    System.IO.IOException:参数不正确。
    控制台上。outputenencoding=System.Text.Encoding.Unicode
    行。同样,它应该是UTF-8。我给出了您可以使用西里尔文示例,因为我正在使用它进行测试。我不知道它是什么语言。我是通过Google translate进行测试的。console应用程序不应该构建为Unicode并在技术上支持任何独立于系统语言设置的字符集吗?并非所有应用程序都是Unicode。设置系统区域设置适用于non-Unicode应用程序。出现“?”表示您的应用程序的行为类似于非Unicode应用程序。我知道并非所有应用程序都是,但我应该能够控制如何构建我的应用程序--Unicode或ASCII。
    enter code here
     private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBox1.Checked)
            {
                textBox1.Font = new Font("Your font", 10);
            }
            else 
            {
                textBox1.Font = new Font("Times New Roman", 10);
            }
        }
    
      Console.OutputEncoding = Console.InputEncoding = Encoding.Unicode;
      Console.Write("Введите свое имя: ");
      string name = Console.ReadLine(); 
      Console.WriteLine($"Привет {name}");