C# UTF8 чтение / вывод

Я пытаюсь сделать что-то, что я думаю, должно быть довольно просто, но я потратил слишком много времени на это уже и я пробовал несколько разных подходов, которые я исследовал, но безрезультатно.

в принципе, у меня есть огромный список имен, в которых есть "специальные" символы из кодировки UTF8.

моя конечная цель-прочитать каждое имя, а затем сделать HTTP-запрос, используя это имя в URL-адресе в качестве переменной GET.

моей первой целью было прочитать в одно имя из файла и поместите его в стандарт, чтобы подтвердить, что я мог читать и писать UTF8 правильно, прежде чем создавать строки и делать все HTTP-запросы.

на test1.txt файл, который я сделал, содержал только это содержимое:

Öwnägé

затем я использовал этот код C# для чтения в файле. Я установил StreamReader кодировка и Console.OutputEncoding to UTF8.

static void Main(string[] args)
{
    Console.OutputEncoding = System.Text.Encoding.UTF8;

    using (StreamReader reader = new StreamReader("test1.txt",System.Text.Encoding.UTF8))
    {
        string line;

        while ((line = reader.ReadLine()) != null)
        {
            Console.WriteLine(line);
        }

    }

    Console.ReadLine();
}

к моему удивлению я получаю такого рода вывод:

enter image description here

ожидаемый результат точно такой же, как и исходное содержимое файла.

как я могу быть уверен, что строки, которые я собираюсь построить, чтобы сделать HTTP-запросы, будут правильными, если я даже не могу выполнить простую задачу как строки чтения/записи UTF8?

3 ответов


ваша программа в порядке (предполагая, что входной файл на самом деле UTF-8). Если вы отлаживаете свою программу и используете окно часов, чтобы посмотреть на строки (line переменная), вы обнаружите, что это правильно. Это - это то, как вы можете быть уверены, что будете отправлять правильные HTTP-запросы (или что еще вы делаете со строками).

то, что вы видите, является ошибкой в консоли Windows.

к счастью, это влияет только на растровые шрифты. Если вы измените консоль окно для использования шрифта TrueType, например Consolas или Lucida Console, проблема уходит.

screenshot

вы можете установить это для всех будущих окон, используя пункт меню "по умолчанию":

screenshot


посмотреть читать Юникод в консоли

Если вы используете .NET 4, вам нужно будет использовать

    Console.InputEncoding = Encoding.Unicode;
    Console.OutputEncoding = Encoding.Unicode;

и убедитесь, что вы используете консоль Lucida в качестве шрифта консоли.

Если вы используете .NET 3.5, вам, вероятно, не повезло.

чтобы эффективно читать строки из файла, я бы, вероятно, использовать:

foreach(var line in File.ReadAllLines(path, Encoding.UTF8))
{
   // do stuff
}

для чтения всех символов, как вы упоминаете, вы должны использовать кодировку по умолчанию, как это

new StreamReader(@"E:\database.txt", System.Text.Encoding.Default))