6

我正在尝试在英语 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

4

5 回答 5

6

按着这些次序:

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

输出应该是:

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

[更新]

也许您想使用该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();
}
于 2013-02-20T00:57:52.660 回答
1

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

  Console.OutputEncoding = Console.InputEncoding = Encoding.Unicode;
  Console.Write("Введите свое имя: ");
  string name = Console.ReadLine(); 
  Console.WriteLine($"Привет {name}"); 
于 2020-12-29T13:29:45.723 回答
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();
}
于 2013-02-20T01:15:59.203 回答
0

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

文件资源管理器采用 Unicode。

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

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

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

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

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

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

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

于 2014-10-15T05:11:24.440 回答