Упражнение. Объединение строк с помощью последовательностей escape-символов

Завершено

Предположим, что вам было предложено создать макет средства командной строки, который создаст счета на английском и японском языках. Вам пока не нужно создавать функции, создающие сами счета. Для утверждения необходимо предоставить интерфейс командной строки внутренним клиентам в отделе выставления счетов. Руководитель просит добавить форматирование, чтобы сделать текущий ход выполнения более понятным. Руководитель также просит предоставить инструкции для японского пользователя о том, как создавать счета на японском языке.

Упражнение. Форматирование литеральных строк в C#

В этом упражнении вы узнаете о различных методах отображения специальных символов и добавлении различных типов форматирования в выходные данные.

Escape-последовательности символов

Последовательность escape-символов — это инструкция среды выполнения для вставки специального символа, который повлияет на выходные данные строки. В C#последовательность escape-символов начинается с обратной косой черты \ , за которой следует экранировать символ, который вы экранируете. Например, последовательность \n добавит новую строку, а последовательность \t добавит табуляцию.

Следующий код использует escape-последовательности символов для добавления новых линий и вкладок:

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

После выполнения кода отобразится следующий результат.

Hello
World!
Hello   World!

Что делать, если необходимо вставить двойную кавычку в литеральную строку? Если вы не используете escape-последовательность символов, вы будете путать компилятора, так как она будет думать, что вы хотите завершить строку преждевременно. Компилятор не понимает назначение символов после второй двойной кавычки.

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

Чтобы справиться с этой ситуацией, используйте escape-последовательность \" :

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

При выполнении приведенного выше кода вы увидите следующие выходные данные:

Hello "World"!

Что делать, если необходимо использовать обратную косую черту для других целей, например для вывода пути к файлу?

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

К сожалению, C# резервирует обратную косую черту для escape-последовательностей, поэтому при выполнении кода компилятор отобразит следующую ошибку:

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

Проблема заключается в последовательности \s. Ошибка \r не возникает, так как это допустимая escape-последовательность для возврата каретки. Однако вы не хотите использовать возврат каретки в этом контексте.

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

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

Экранирование символа косой черты создает нужные выходные данные:

c:\source\repos

Форматирование выходных данных с помощью последовательностей escape-символов

  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:    
    

Строковый литерал verbatim

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

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
    

Escape-символы Юникода

Можно также добавлять закодированные символы в литеральные строки с помощью escape-последовательности \u, за которой стоит набор из четырех символов, представляющих некоторый символ в Юникоде (UTF-16).

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

Примечание.

Здесь существует ряд особенностей. Во первых, некоторые консоли, такие как командная строка Windows, могут отображать не все символы Юникода. Эти символы будут заменены вопросительными знаками. Кроме того, в примерах здесь используется UTF-16. Для некоторых символов требуется UTF-32, поэтому нужна другая управляющая последовательность. Это сложная тема, и этот модуль лишь в общих чертах описывает возможные решения. В зависимости от ваших потребностей может потребоваться много времени на обучение и работу с символами Юникода в приложениях.

Форматирование выходных данных с помощью escape-символов юникода

Чтобы завершить макет средства командной строки, вы добавите фразу на японском языке, которая переводит сообщение "Для создания японских счетов". Затем вы увидите подробную литеральную строку, представляющую команду, которую пользователь может ввести. Вы также добавите некоторые escape-последовательности для форматирования.

  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 или двойную кавычку \", используйте escape-последовательности.
  • Используйте escape-символ для обратной косой черты \\, если необходимо использовать обратную косую черту в других сценариях.
  • Используйте директиву @ для создания буквальных строковых литералов, чтобы сохранить форматирование пробелов и символов обратной косой черты в строке.
  • Используйте \u и код из четырех символов для представления символов Юникода (UTF-16) в строке.
  • Символы Юникода могут неправильно печатать в зависимости от приложения.