将非英文字符输入到C#控制台应用程序中的问题

时间:2013-02-19 23:50:26

标签: c# visual-studio-2010 unicode console-application

我正在尝试使用英文Windows 7 Ultimate 64位上的Visual Studio 2010构建一个控制台C#应用程序。当我尝试使用非ASCII字符复制路径然后将其粘贴到我的控制台应用程序时,非ASCII字符变为???。有什么方法可以解决这个问题吗?

以下是我正在复制的内容:C:\Test Folder\документи

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

Console.OutputEncoding = System.Text.Encoding.UTF8;
string strLineUserInput = Console.ReadLine();

但是,即使我更改了字体,当我使用调试器测试时,C:\Test Folder\документи仍会在C:\Test Folder\?????????变量中变为strLineUserInput

另请注意,与链接“重复帖子”不同,我在输入中需要这些字符。

所以,如果我这样做,那么:

Console.InputEncoding = System.Text.Encoding.UTF8;
string strLineUserInput = Console.ReadLine();

如果我阅读上面的文字,我的strLineUserInput会变为null

5 个答案:

答案 0 :(得分:5)

请按照以下步骤操作:

  1. 在调试/不调试时,将控制台窗口字体更改为 Lucida Console
  2. 执行以下代码:

    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);
    }
    
  3. 输出应为:

    C:\Test Folder\документи
    C:\Test Folder\документи
    C:\Test Folder\документи
    

    <强> [UPDATE]

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

    static void Main(string[] args)
    {
        Console.OutputEncoding = Encoding.UTF8;
        Console.InputEncoding = Encoding.UTF8;
    
        string s = @"C:\Test Folder\документи";
        Console.WriteLine(s);
    
        // input C:\Test Folder\документи
        var strInput = ReadLineUTF();
    
        Console.WriteLine(strInput);
    }
    
    static string ReadLineUTF()
    {
        ConsoleKeyInfo currentKey;
    
        var sBuilder = new StringBuilder();
        do
        {
            currentKey = Console.ReadKey();
            // avoid capturing newline
            if (currentKey.Key != ConsoleKey.Enter)
                sBuilder.Append(currentKey.KeyChar);
    
        }
        // check if Enter was pressed
        while (currentKey.Key != ConsoleKey.Enter);
    
        // move on the next line
        Console.WriteLine();
    
        return sBuilder.ToString();
    }
    

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

这对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();
}

答案 3 :(得分:0)

您的文字看起来像是俄文。

文件资源管理器是Unicode格式。

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

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

尝试查看您的控制面板&gt;区域和语言设置:

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

答案 4 :(得分:-1)

如果您只想将输入复制粘贴到文本框中,这非常容易。 在您的应用程序中选中Box Control,您可以使用代码更改字体。

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);
        }
    }

或者,如果您总是粘贴非英语,那么您可以更改文本框的字体属性。