2013-02-19 10 views
5

Sto provando a creare un'applicazione C# di console con Visual Studio 2010 sull'inglese Windows 7 Ultimate 64-bit. Quando provo a copiare un percorso con caratteri non ASCII e poi lo incollo nell'app della mia console, i caratteri non ASCII si trasformano in ???. C'è un modo per risolvere questo problema?Problemi con l'immissione di caratteri non inglesi in un'app console C#

Ecco quello che sto copia: C:\Test Folder\документи

E questo è il codice (dopo un link suggerito sopra):

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

Ma anche se cambio il tipo di carattere, il C:\Test Folder\документи diventa ancora C:\Test Folder\????????? in strLineUserInput variabile quando eseguo il test con un debugger.

Inoltre, a differenza del collegamento "post duplicato", ho bisogno di questi caratteri sull'input.

Quindi, se faccio questo allora:

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

mio strLineUserInput diventa null se ho letto il testo di cui sopra.

+0

Sì, vai alle impostazioni della finestra della console e cambia il carattere in uno che supporta caratteri estesi. La console di Lucida dovrebbe fare. –

+3

possibile duplicato di [Come scrivere caratteri unicode per console?] (Http://stackoverflow.com/questions/5750203/how-to-write-unicode-chars-to-console) –

+0

Potresti includere nella tua domanda alcuni dei i personaggi? –

risposta

4

procedere come segue:

  1. Cambiare il tipo di carattere finestra della console per Lucida Console sia per quando il debug/non debug.
  2. eseguire il codice seguente:

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

L'output dovrebbe essere:

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

[UPDATE]

Forse si vorrebbe utilizzare il metodo ReadKey in per farlo funzionare (devi ancora usare lo Lucida Console font):

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(); 
} 
+0

Ottiene 'System.IO.IOException: il parametro non è corretto.' Sulla riga 'Console.OutputEncoding = System.Text.Encoding.Unicode'. – c00000fd

+0

@ c00000fd, che ne dici adesso? –

+0

Ancora, dovrebbe essere UTF-8. Ti ho dato un esempio in cirillico solo perché stavo testando con esso. – c00000fd

0

Questo mi sembra un eccessivo completo per C#, ma ha funzionato per me:

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

il testo sembra è in russo.

Esplora file è in Unicode.

L'applicazione della console probabilmente non è in Unicode.

Quando si incolla nella finestra della console i caratteri Unicode vengono convertiti in un sistema non Unicode in base alle impostazioni locali del sistema correnti. Se le impostazioni internazionali del tuo sistema non supportano il russo, i tuoi personaggi verranno convertiti in "?".

Prova rivedere il vostro pannello di controllo> Regione e le impostazioni della lingua:

  1. Aprire Pannello di controllo
  2. Selezionare Paese e lingua
  3. recensione Lingua corrente per non Unicode
  4. Se non è impostata su russo , prova "Cambia sistema locale" e imposta su russo.
+0

Non so quale lingua sia. L'ho fatto tramite Google translate a scopo di test. L'app della console non dovrebbe essere costruita come Unicode e tecnicamente supportare qualsiasi set di caratteri indipendente dalle impostazioni della lingua del sistema? – c00000fd

+0

Non tutte le applicazioni sono Unicode. L'impostazione delle impostazioni internazionali del sistema si applica alle applicazioni non Unicode. L'apparenza di "?" è indicativo del fatto che l'applicazione si comporti come un'app non Unicode. –

+0

So che non tutti lo sono, ma dovrei essere in grado di controllare come voglio costruire il mio - Unicode o ASCII. – c00000fd

-1

È molto semplice se si desidera avere una copia di input incollata nella casella di testo. Avere un controllo casella di spunta nell'applicazione e si può avere il codice per modificare il carattere qualcosa di simile.

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

Oppure se si sta incollando non inglese sempre, è possibile modificare la proprietà del carattere della casella di testo.

Problemi correlati