C # UTF8 Чтение / Вывод - PullRequest
       13

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

6 голосов
/ 06 марта 2012

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

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

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

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

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

OWNAGE

Затем я использовал этот код C # для чтения в файле. Я установил кодировку StreamReader и Console.OutputEncoding на 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 ]

6 голосов
/ 06 марта 2012

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

Вы видите ошибку в консоли Windows.

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

screenshot

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

screenshot

3 голосов
/ 06 марта 2012

См. Чтение юникода с консоли

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

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

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

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

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

foreach(var line in File.ReadAllLines(path, Encoding.UTF8))
{
   // do stuff
}
1 голос
/ 02 февраля 2013

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

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