练习 - 使用字符转义序列将字符串组合起来

已完成

假设你需要创建一个命令行工具原型来生成英语和日语发票。 你尚且无需构建生成发票的实际功能。 你只需要向计费部门的内部客户提供命令行的用户界面来获取他们的批准。 你的经理要求你确保添加格式以使该工具的当前进度清晰明了。 还要求你为日语用户提供有关如何生成日语发票的说明。

练习 - 在 C# 中设置文本字符串的格式

在本练习中,你将学习用来显示特殊字符和向输出添加不同格式类型的不同技术。

字符转义序列

转义字符序列是一条指令,指示运行时插入会影响字符串输出的特殊字符。 在 C# 中,转义字符序列以反斜杠 \ 开头,后跟要转义的字符。 例如,\n 序列将添加一个新行,而 \t 序列将添加一个制表符。

以下代码使用转义字符序列来添加换行符和制表符:

Console.WriteLine("Hello\nWorld!");
Console.WriteLine("Hello\tWorld!");

如果运行代码,将看到以下输出:

Hello
World!
Hello   World!

如果需要在文本字符串中插入双引号,该怎么办? 如果不使用字符转义序列,就会令编译器混淆,因为它会认为你想要提前终止字符串, 而理解不到第二个双引号后面的字符的用途。

Console.WriteLine("Hello "World"!");

.NET 编辑器会在 World 下放置一条红色的波浪线。 但是,如果仍然尝试运行代码,则会看到以下输出:

(1,27): error CS1003: Syntax error, ',' expected
(1,27): error CS0103: The name 'World' does not exist in the current context
(1,32): error CS1003: Syntax error, ',' expected

要处理这种情况,请使用 \" 转义序列:

Console.WriteLine("Hello \"World\"!");

如果运行上面的代码,将看到以下输出:

Hello "World"!

如果需要将反斜杠另作他用(例如显示文件路径),该怎么办?

Console.WriteLine("c:\source\repos");

遗憾的是,C# 将反斜杠固定用于转义序列,因此如果运行此代码,编译器将显示以下错误:

(1,22): error CS1009: Unrecognized escape sequence

出问题的是序列 \s\r 不会产生错误,因为它是回车符的有效转义序列。 不过,你不想在此上下文中使用回车符。

要解决此问题,请使用 \\ 显示单个反斜杠。

Console.WriteLine("c:\\source\\repos");

对反斜杠字符进行转义会生成你想要的输出:

c:\source\repos

使用字符转义序列来设置输出格式

  1. 选择 .NET 编辑器中的所有代码,请按 Delete 键或 Backspace 键删除它。

  2. 若要创建命令行工具原型,请在编辑器中输入以下代码:

    Console.WriteLine("Generating invoices for customer \"Contoso Corp\" ...\n");
    Console.WriteLine("Invoice: 1021\t\tComplete!");
    Console.WriteLine("Invoice: 1022\t\tComplete!");
    Console.WriteLine("\nOutput Directory:\t");
    
  3. 现在,运行代码。 你将在输出控制台中看到以下结果:

    Generating invoices for customer "Contoso Corp" ...
    
    Invoice: 1021           Complete!
    Invoice: 1022           Complete!
    
    Output Directory:    
    

逐字字符串字面量

逐字字符串文本将保留所有空格和字符,而无需转义反斜杠。 要创建逐字字符串,请在文本字符串的前面使用 @ 指令。

Console.WriteLine(@"    c:\source\repos    
        (this is where your code goes)");

请注意,该字符串跨越两行,并且此 C# 指令生成的空格保留在以下输出中。

    c:\source\repos    
        (this is where your code goes)

使用逐字字符串字面量来设置输出格式

  1. 在先前创建的代码下方添加以下代码行:

    Console.Write(@"c:\invoices");
    
  2. 现在,运行代码。 你将看到以下包含“输出目录”的结果:

    Generating invoices for customer "Contoso Corp" ...
    
    Invoice: 1021           Complete!
    Invoice: 1022           Complete!
    
    Output Directory:
    c:\invoices
    

Unicode 转义字符

你还可使用 \u 转义序列在文本字符串中添加编码字符,然后使用四个字符的代码表示 Unicode (UTF-16) 中的某些字符。

// Kon'nichiwa World
Console.WriteLine("\u3053\u3093\u306B\u3061\u306F World!");

注意

此处有几个注意事项。 首先,某些控制台(例如 Windows 命令提示符)不会显示所有 Unicode 字符。 它将用问号字符代替这些字符。 另外,此处使用的示例是 UTF-16。 有些字符需要 UTF-32,因此需要不同的转义序列。 这一主题很复杂,该模块仅旨在向你展示可能的方法。 根据你的需求,可能需要花费大量时间来学习 Unicode 字符并在应用程序中加以运用。

使用 unicode 转义字符来设置输出格式

若要完成命令行工具原型,需要添加一个日语短语,该短语翻译为:“生成日语发票”。 然后,将显示一个逐字文本字符串,该字符串表示用户可以输入的命令。 你还将添加一些转义序列来进行格式设置。

  1. 将以下代码添加到应用程序:

    // To generate Japanese invoices:
    // Nihon no seikyū-sho o seisei suru ni wa:
    Console.Write("\n\n\u65e5\u672c\u306e\u8acb\u6c42\u66f8\u3092\u751f\u6210\u3059\u308b\u306b\u306f\uff1a\n\t");
    // User command to run an application
    Console.WriteLine(@"c:\invoices\app.exe -j");
    
  2. 为了确保代码正确,请将它与以下内容进行比较:

    Console.WriteLine("Generating invoices for customer \"Contoso Corp\" ...\n");
    Console.WriteLine("Invoice: 1021\t\tComplete!");
    Console.WriteLine("Invoice: 1022\t\tComplete!");
    Console.WriteLine("\nOutput Directory:\t");
    Console.Write(@"c:\invoices");
    
    // To generate Japanese invoices:
    // Nihon no seikyū-sho o seisei suru ni wa:
    Console.Write("\n\n\u65e5\u672c\u306e\u8acb\u6c42\u66f8\u3092\u751f\u6210\u3059\u308b\u306b\u306f\uff1a\n\t");
    // User command to run an application
    Console.WriteLine(@"c:\invoices\app.exe -j");
    
  3. 现在,运行代码。 你将在输出控制台中看到以下结果:

    Generating invoices for customer "Contoso Corp" ...
    
    Invoice: 1021            Complete!
    Invoice: 1022            Complete!
    
    Output Directory:
    c:\invoices
    
    日本の請求書を生成するには:
        c:\invoices\app.exe -j
    

概括

下面是到你目前为止所了解的文本字符串格式设置的相关内容:

  • 当需要在文本字符串中插入特殊字符时,请使用字符转义序列,例如制表符 \t、换行符 \n 或双引号 \"
  • 在所有其他情况下,需要使用反斜杠时,请对反斜杠 \\ 使用转义字符。
  • 使用 @ 指令创建逐字字符串文本,以将所有空白格式和反斜杠字符保留在字符串中。
  • 使用 \u 加上四个字符的代码来表示字符串中的 Unicode 字符 (UTF-16)。
  • 根据应用程序的不同,Unicode 字符可能无法正确打印。