Мой код C# с использованием System.IO.StreamWriter выводит случайные китайские / юникодные символы определенной длины - PullRequest
0 голосов
/ 23 апреля 2020

Я пытался написать код для вывода всех простых чисел от 3 до int limit в документе (используя System.IO.StreamWriter), а также в консоль. Это код, который я написал:

using System;
using System.IO;

namespace primes
{
    class Program
    {
        static void Main(string[] args)
        {
            string output = "";
            a:
            Console.Write("Numbers to test >> ");
            string limitStr = Console.ReadLine();
            int limit = Convert.ToInt32(limitStr);
            if (limit < 3)
            {
                Console.WriteLine("Write an integer above 2.\n");
                goto a;
            }
            DateTime start = DateTime.Now;
            for (int i = 0; i < limit; i++)
            {
                for (int j = 2; j < i; j++)
                {
                    if (j == Math.Ceiling(Convert.ToDouble(i / 2)) + 1)
                    {
                        Console.WriteLine(i + " is prime.");
                        output += Convert.ToString(Convert.ToString(i) + "\n");
                    }
                    else if (i % j == 0)
                    {
                        goto b;
                    }
                }
                b:;
            }
            using (System.IO.StreamWriter sw = new StreamWriter("primes.txt")) 
            {
                sw.Write(output);
            }
            string timeElapsed = Convert.ToString((DateTime.Now - start).TotalSeconds);
            Console.Write("\nTook " + timeElapsed + " seconds to run.");

            ConsoleKeyInfo k;

            Console.WriteLine("\nPress ESC to exit...");
            while (true)
            {
                k = Console.ReadKey(true);
                if (k.Key == ConsoleKey.Escape)
                    break;
            }

        }
    }
}

При использовании int limit = 50 я получаю этот вывод в текстовом документе:

3
5
7
11
13
17
19
23
29
31
37
41
43
47

Но когда int limit = 1260, он выводит это:

ਲ਼ਵ਷ㄱㄊਲ਼㜱ㄊਹ㌲㈊ਹㄳ㌊਷ㄴ㐊ਲ਼㜴㔊ਲ਼㤵㘊਱㜶㜊਱㌷㜊ਹ㌸㠊ਹ㜹ㄊ㄰ㄊ㌰ㄊ㜰ㄊ㤰ㄊ㌱ㄊ㜲ㄊㄳㄊ㜳ㄊ㤳ㄊ㤴ㄊㄵㄊ㜵ㄊ㌶ㄊ㜶ㄊ㌷ㄊ㤷ㄊㄸㄊㄹㄊ㌹ㄊ㜹ㄊ㤹㈊ㄱ㈊㌲㈊㜲㈊㤲㈊㌳㈊㤳㈊ㄴ㈊ㄵ㈊㜵㈊㌶㈊㤶㈊ㄷ㈊㜷㈊ㄸ㈊㌸㈊㌹㌊㜰㌊ㄱ㌊㌱㌊㜱㌊ㄳ㌊㜳㌊㜴㌊㤴㌊㌵㌊㤵㌊㜶㌊㌷㌊㤷㌊㌸㌊㤸㌊㜹㐊㄰㐊㤰㐊㤱㐊ㄲ㐊ㄳ㐊㌳㐊㤳㐊㌴㐊㤴㐊㜵㐊ㄶ㐊㌶㐊㜶㐊㤷㐊㜸㐊ㄹ㐊㤹㔊㌰㔊㤰㔊ㄲ㔊㌲㔊ㄴ㔊㜴㔊㜵㔊㌶㔊㤶㔊ㄷ㔊㜷㔊㜸㔊㌹㔊㤹㘊㄰㘊㜰㘊㌱㘊㜱㘊㤱㘊ㄳ㘊ㄴ㘊㌴㘊㜴㘊㌵㘊㤵㘊ㄶ㘊㌷㘊㜷㘊㌸㘊ㄹ㜊㄰㜊㤰㜊㤱㜊㜲㜊㌳㜊㤳㜊㌴㜊ㄵ㜊㜵㜊ㄶ㜊㤶㜊㌷㜊㜸㜊㜹㠊㤰㠊ㄱ㠊ㄲ㠊㌲㠊㜲㠊㤲㠊㤳㠊㌵㠊㜵㠊㤵㠊㌶㠊㜷㠊ㄸ㠊㌸㠊㜸㤊㜰㤊ㄱ㤊㤱㤊㤲㤊㜳㤊ㄴ㤊㜴㤊㌵㤊㜶㤊ㄷ㤊㜷㤊㌸㤊ㄹ㤊㜹ㄊ〰ਹ〱㌱ㄊ㄰ਹ〱ㄲㄊ㌰਱〱㌳ㄊ㌰ਹ〱㤴ㄊ㔰਱〱ㄶㄊ㘰ਲ਼〱㤶ㄊ㠰਷〱ㄹㄊ㤰ਲ਼〱㜹ㄊ〱ਲ਼ㄱ㤰ㄊㄱ਷ㄱ㌲ㄊ㈱ਹㄱㄵㄊ㔱ਲ਼ㄱ㌶ㄊ㜱਱ㄱㄸㄊ㠱਷ㄱ㌹ㄊ〲਱㈱㌱ㄊㄲ਷㈱㌲ㄊ㈲ਹ㈱ㄳㄊ㌲਷㈱㤴ㄊ㔲ਹ

Этот жаргон продолжается с большими и большими числами, с большим количеством символов, иногда с некоторым шаблоном на некоторое время в тексте. Что я делаю неправильно? В консоли все выглядит нормально.

Информация: Использование Visual Studio Community 2019 для редактирования

Использование Windows 10 Home Notepad.exe для доступа к primes.txt

1 Ответ

0 голосов
/ 23 апреля 2020

Вам необходимо указать тип кодировки текста на выходе StreamWriter для вашего текстового файла.

Заменить:

using (System.IO.StreamWriter sw = new StreamWriter("primes.txt"))

на

using (System.IO.StreamWriter sw = new StreamWriter("primes.txt", false, System.Text.Encoding.UTF8))
...