Подтвердить что ты не робот

Как настроить консоль для печати любого из 65535 символов UNICODE

Я экспериментирую с символами unicode и беря значения unicode из Wikipedia страницы

Проблема заключается в том, что моя консоль отображает все символы C0 Controls и Basic Latin unicode, т.е. от U + 0000 до U + 00FF, но для всех других категорий, таких как Latin Extended -B, кириллица, другие languges и т.д., консоль печатает знак вопроса (?).

Мой код С#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DataTypes
{
    class Program
    {
        static void Main(string[] args)
        {

            char ch = '\u0181';



            Console.WriteLine("the unicode character is  value" + ch);

        }
    }
}

Я работаю над Windows 7, Visual studio 2010. Что мне делать, чтобы увеличить поддержку Unicode.

4b9b3361

Ответ 1

В этом вопросе много истории, я буду лапшу об этом некоторое время. Приложения в режиме консоли могут работать только с 8-битным кодированием текста. Это восходит к дизайнерскому решению, сделанному 42 года назад Ken Thompson и др., Когда они разработали Unix. Основная особенность Unix заключалась в том, что терминал ввода-вывода выполнялся через каналы, и вы могли объединять трубы вместе, чтобы подавать вывод одной программы на вход другого. Эта функция также была реализована в Windows и поддерживается .NET также с помощью свойств ProcessStartInfo.RedirectStandardXxxx.

Хорошая функция, но это стало проблемой, когда операционные системы начали использовать Unicode. Windows NT была первой, которая полностью была Unicode. Символы Юникода всегда должны быть закодированы, общий выбор тогда был UCS, позже преобразованный в utf-16. Теперь проблема с перенаправлением ввода-вывода, программа, которая выплескивает 16-разрядные кодированные символы, не будет работать хорошо, когда она перенаправляется на программу, которая все еще использует 8-битные кодированные символы.

Кредит Кен Томпсон, а также найдя решение этой проблемы, изобрел кодировку utf-8.

Это работает и в Windows. Простое приложение в консольном режиме, вы должны повторно назначить свойство Console.OutputEncoding:

using System;
using System.Text;

class Program {
    static void Main(string[] args) {
        Console.OutputEncoding = Encoding.UTF8;
        Console.WriteLine("Ĥėļŀō ŵŏŗłđ");
        Console.ReadLine();
    }
}

Теперь вы столкнулись с другой проблемой, шрифт, выбранный для окна консоли, скорее всего, не сможет отобразить текст. Нажмите Alt + Space, чтобы вызвать системное меню, "Свойства", вкладку "Шрифт". Вам нужно будет выбрать не растровый шрифт. Выбор очень тонкий, на Vista и вы можете выбрать Consolas. Повторно запустите свою программу, и символы с акцентом должны отображаться правильно. К сожалению, проблема с программным шрифтом в консоли - проблема, вам нужно задокументировать этот шаг конфигурации. Кроме того, шрифт вроде Consolas не имеет полного набора возможных символов Unicode. Вероятно, вы увидите прямоугольники для кодов Unicode, для которых у него нет глифов. Все неудобное напоминание о том, что создание GUI-программы действительно лучший выбор.