6

英語のWindows7Ultimate64ビットでVisualStudio2010を使用してコンソール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 に答える
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 に答える