visualstudio2010-在C#控制台应用程序中输入非英文字符的问题
本文关键字:文字符 字符 问题 控制台 应用程序 输入 visualstudio2010- | 更新日期: 2023-09-27 18:00:21
我正试图用Visual Studio 2010在英文版Windows7 Ultimate 64位上构建一个控制台C#应用程序。当我尝试复制一个包含非ASCII字符的路径,然后将其粘贴到控制台应用程序中时,非ASCII字符会变成???。有什么办法解决这个问题吗?
以下是我正在复制的内容:C:'Test Folder'документи
这是代码(在上面建议的链接之后):
Console.OutputEncoding = System.Text.Encoding.UTF8;
string strLineUserInput = Console.ReadLine();
但是,即使我更改了字体,当我用调试器测试strLineUserInput
变量时,C:'Test Folder'документи
仍然会变成C:'Test Folder'?????????
。
还要注意的是,与链接"复制帖子"不同,我需要在输入中使用这些字符。
所以如果我这样做的话:
Console.InputEncoding = System.Text.Encoding.UTF8;
string strLineUserInput = Console.ReadLine();
如果我阅读了上面的文本,我的strLineUserInput
就变成了null
。
按照以下步骤操作:
- 调试/不调试时,将控制台窗口字体更改为Lucida控制台
-
执行以下代码:
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控制台字体):
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();
}
下面的代码对我有帮助。请使用Encoding.UTF8
Console.OutputEncoding = Console.InputEncoding = Encoding.Unicode;
Console.Write("Введите свое имя: ");
string name = Console.ReadLine();
Console.WriteLine($"Привет {name}");
这对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();
}
您的文本看起来像是俄语。
文件资源管理器采用Unicode。
控制台应用程序可能不是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);
}
}
或者,如果您总是粘贴非英语,那么您可以更改文本框的字体属性。