为什么我的 StringBuilder.AppendLine 方法无法在 C# .NET 中保存非英文字母?

问题描述 投票:0回答:1

我正在做一个学校项目,任务是创建一个应用程序,其中一个功能是将多行文本(用户输入)保存到字符串中。我知道代码的某些部分可能已经过时,但我们学校编译器仅支持.NET版本4(编辑:我在Visual Studio 2022中编译,学校编译器只是我们展示最终作品的地方,这就是为什么版本是已完成作品的限制)。我仍在学习,我确信还有其他可以改进的地方,但让我们看看主要问题。

当用户输入标准捷克语文本(例如“včera”,意思是昨天)时,保存并稍后返回的文本显示“vera”。如果我只输入这些特殊字符,例如“ůčšěž”,它没有任何意义,则字符串内容将为空。 当我使用不同的方法创建字符串时,例如基本的

Console.WriteLine()
,特殊字符会被保存。 我使用的方法应该接受用户输入,并将多行文本与 DateTime 一起提供给双向链表内的对象 Record。下面,我将展示相关代码,因为错误可能会在途中产生。

public static void CreateNewRecord()
{
    Console.Write("Date: ");
    if (DateTime.TryParse(Console.ReadLine(), out DateTime parsedDate))
    {
        Console.WriteLine("\nText: ");

        StringBuilder sb = new StringBuilder();

        while (true)
        {
            string textLine = Console.ReadLine();
            if (textLine.ToLower() == "save")
                break;
            sb.AppendLine(textLine);
        }
        string recordText = sb.ToString();
        Program.records.AddLast(new Record(parsedDate, recordText));
    }
    else
    {
        Console.WriteLine("Wrong date format.");
    }
}

这将创建记录并使用重写的 ToString(),我正在尝试读取它:

public override string ToString()
{
    return string.Format("Date: {0}\n\n{1}", Date, Text);
}

但是,当尝试使用

Console.WriteLine(records.Last());
读取内容时,仅返回英文字母文本。 如果有人知道出了什么问题,我们将欢迎您的回答。

我尝试将 UTF-8 编码添加到程序顶部,但这没有帮助。我尝试创建一个非常简单的字符串生成器,它附加部分文本(而不是整行),即使带有特殊字符,它也会返回。

我希望返回多行文本,其中包含用户保存到其中的所有符号。

c# stringbuilder
1个回答
0
投票

帮助您正确处理特殊字符:

  1. 设置控制台编码:在读取用户输入并写入控制台之前,应将控制台的编码设置为UTF-8,以正确处理特殊字符。您可以在程序开始时执行此操作:
Console.OutputEncoding = Encoding.UTF8;
Console.InputEncoding = Encoding.UTF8;
  1. 更新您的 CreateNewRecord 方法:确保您读取用户输入并使用 UTF-8 编码正确存储它。您可以像这样修改 CreateNewRecord 方法:
   public static void CreateNewRecord()
   {
       Console.Write("Date: ");
       if (DateTime.TryParse(Console.ReadLine(), out DateTime parsedDate))
       {
           Console.WriteLine("\nText: ");

           StringBuilder sb = new StringBuilder();

           while (true)
           {
               string textLine = Console.ReadLine();
               if (textLine.ToLower() == "save")
                   break;
               sb.AppendLine(textLine);
           }
           string recordText = sb.ToString();
           Program.records.AddLast(new Record(parsedDate, recordText));
       }
       else
       {
           Console.WriteLine("Wrong date format.");
       }
   }
  1. 确保您的记录类处理特殊字符:确保您的记录类在存储和检索文本时正确处理特殊字符。如果您的 Record 类使用字符串来存储文本,则默认情况下它应该可以正确处理 UTF-8 编码的字符串。通过这些更改,您的程序应该正确处理带有特殊字符的多行文本。确保控制台编码设置为UTF-8,保存和显示文本时应保留特殊字符。
© www.soinside.com 2019 - 2024. All rights reserved.