Skip to content
On this page

字符转义序列和逐字字符串

假设你的经理要求你创建一个命令行工具原型,该原型将生成英语和日语发票。你不必构建用于生成发票的实际功能;只需向计费部门内部客户提供命令行的用户界面就能获得他们的批准。你的经理要求你确保添加格式来清楚显示工具的当前进度。还要求你为日语用户提供有关如何生成日语发票的说明。

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

C# 提供了大量用于设置字符串格式的选项。在本模块中,我们将仅查看一些最常用的选项。但是,无论你能想到什么,你都能实现。最难的部分可能是知道在搜索答案时使用什么术语。

字符转义序列

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

以下代码使用转义字符序列添加空格。

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


// Hello
// World!
// Hello   World!

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

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

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

bash
(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

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

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

// Hello "World"!

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

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

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

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

出问题的是序列 \s\r 不会产生错误,因为它是回车符的有效转义序列。但是,你不太可能希望在这种情况下使用回车符。

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

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

// c:\source\repos

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

使用字符转义序列设置命令行应用输出的格式

若要创建命令行工具原型,请在编辑器中添加以下代码:

csharp
Console.WriteLine("Generating invoices for customer \"ABC Corp\" ...\n");
Console.WriteLine("Invoice: 1021\t\tComplete!");
Console.WriteLine("Invoice: 1022\t\tComplete!");
Console.WriteLine("\nOutput Directory:\t");

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

逐字字符串文本

逐字字符串文本将保留所有空格和字符,而无需转义反斜杠。要创建逐字字符串,请在文本字符串的前面使用 @ 指令。两个连续的双引号字符 ("") 在输出字符串中被打印成一个双引号字符 (")。

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

请注意,在 @ 指令中写入时,字符串跨越两行,保留了空格,两个连续的双引号字符在下面的输出中被应用为一个双引号字符:

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

使用逐字文本字符串设置命令行应用程序输出的格式

csharp
Console.WriteLine("Generating invoices for customer \"ABC Corp\" ...\n");
Console.WriteLine("Invoice: 1021\t\tComplete!");
Console.WriteLine("Invoice: 1022\t\tComplete!");
Console.WriteLine("\nOutput Directory:\t");
Console.Write(@"c:\invoices");

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

Unicode 转义字符

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

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

// こんにちは World!

备注

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

使用 Unicode 转义字符设置命令行应用程序输出的格式

为了完成模拟的命令行用户界面,我们将添加一个日语短语,翻译成“生成日语发票”,然后使用带标志的应用程序可执行文件提供逐字文本字符串。我们还将添加一些转义序列来进行格式设置。

csharp
Console.WriteLine("Generating invoices for customer \"ABC 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");
Console.WriteLine(@"c:\invoices\app.exe -j");

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

概括

下面是关于设置文本字符串格式要记住的最重要的事项:

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