2013-02-19 36 views
5

Tôi đang cố gắng tạo ứng dụng giao diện điều khiển C# với Visual Studio 2010 bằng tiếng Anh Windows 7 Ultimate 64 bit. Khi tôi cố gắng sao chép một đường dẫn với các ký tự không phải ASCII và sau đó dán nó vào ứng dụng giao diện điều khiển của tôi, các ký tự không phải ASCII biến thành ???. Có cách nào để sửa lỗi này không?Sự cố với việc nhập các ký tự không phải tiếng Anh vào ứng dụng giao diện điều khiển C#

Đây là những gì tôi sao chép: C:\Test Folder\документи

Và đây là mã (sau khi một liên kết gợi ý ở trên):

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

Nhưng ngay cả nếu tôi thay đổi font chữ, các C:\Test Folder\документи vẫn trở thành C:\Test Folder\????????? trong strLineUserInput biến khi tôi kiểm tra nó bằng trình gỡ lỗi.

Cũng lưu ý rằng không giống như liên kết "bài đăng trùng lặp", tôi cần các ký tự này trên đầu vào.

Vì vậy, nếu tôi làm điều này thì:

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

My strLineUserInput trở thành null nếu tôi đọc được nội dung trên.

+0

Có, hãy chuyển tới cài đặt cửa sổ bảng điều khiển và thay đổi phông chữ thành một trong đó hỗ trợ các ký tự mở rộng. Bàn điều khiển Lucida nên làm. –

+3

bản sao có thể có của [Cách viết ký tự unicode thành bàn điều khiển?] (Http://stackoverflow.com/questions/5750203/how-to-write-unicode-chars-to-console) –

+0

Bạn có thể đưa vào câu hỏi của mình một số các nhân vật? –

Trả lời

4

Thực hiện theo các bước sau:

  1. Thay đổi font giao diện điều khiển cửa sổ để Lucida Console cho cả khi gỡ lỗi/không gỡ lỗi.
  2. Execute đoạn mã sau:

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

Sản lượng nên là:

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

[UPDATE]

Có lẽ bạn muốn sử dụng phương pháp ReadKey trong để có nó hoạt động (bạn vẫn phải sử dụng 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

Tôi nhận được 'System.IO.IOException: Tham số không chính xác.' trên dòng' Console.OutputEncoding = System.Text.Encoding.Unicode'. – c00000fd

+0

@ c00000fd, còn bây giờ thì sao? –

+0

Một lần nữa, nó phải là UTF-8. Tôi đã cho bạn một ví dụ Cyrillic chỉ vì tôi đã thử nghiệm với nó. – c00000fd

0

Điều này có vẻ giống như một overkill hoàn chỉnh cho C# nhưng nó làm việc cho tôi:

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

văn bản của bạn có vẻ như nó là bằng tiếng Nga.

Trình khám phá tệp bằng Unicode.

Ứng dụng bảng điều khiển có thể không có trong Unicode.

Khi bạn dán vào cửa sổ Bảng điều khiển, các ký tự Unicode của bạn sẽ chuyển đổi thành hệ thống không phải Unicode dựa trên ngôn ngữ hệ thống hiện tại của bạn. Nếu ngôn ngữ hệ thống của bạn không hỗ trợ tiếng Nga, ký tự của bạn sẽ chuyển thành "?".

Hãy thử xem xét Control Panel của bạn> Region và Cài đặt ngôn ngữ:

  1. mở Control Panel
  2. Chọn Region and Language
  3. xét ngôn ngữ hiện tại cho phi Unicode
  4. Nếu nó không được đặt để Nga , hãy thử "Thay đổi ngôn ngữ hệ thống" và đặt thành tiếng Nga.
+0

Tôi không biết nó là ngôn ngữ gì. Tôi đã làm điều đó thông qua Google dịch cho mục đích thử nghiệm. Không nên ứng dụng giao diện điều khiển được xây dựng dưới dạng Unicode và hỗ trợ kỹ thuật mọi bộ ký tự độc lập với cài đặt ngôn ngữ hệ thống? – c00000fd

+0

Không phải tất cả các ứng dụng đều là Unicode. Đặt ngôn ngữ hệ thống áp dụng cho các ứng dụng không phải Unicode. Vẻ ngoài của "?" là biểu hiện ứng dụng của bạn hoạt động giống như một ứng dụng không phải Unicode. –

+0

Tôi biết rằng không phải tất cả, nhưng tôi sẽ có thể kiểm soát cách tôi muốn xây dựng của tôi - Unicode hoặc ASCII. – c00000fd

-1

Rất dễ dàng nếu bạn chỉ muốn có bản sao nhập được dán vào hộp văn bản của bạn. Có một hộp kiểm Kiểm soát trong ứng dụng của bạn và bạn có thể có mã để thay đổi phông chữ của bạn một cái gì đó như thế này.

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

Hoặc nếu bạn đang dán không phải tiếng Anh thì bạn có thể thay đổi thuộc tính phông chữ của hộp văn bản.

Các vấn đề liên quan