Ćwiczenie — łączenie ciągów przy użyciu sekwencji ucieczki znaków

Ukończone

Załóżmy, że poproszono Cię o utworzenie makiety narzędzia wiersza polecenia, które będzie generować faktury zarówno w języku angielskim, jak i japońskim. Nie musisz jeszcze tworzyć rzeczywistej funkcjonalności generowania faktur. Do zatwierdzenia wystarczy podać interfejs wiersza polecenia klientom wewnętrznym w dziale rozliczeniowym. Kierownik poprosił Cię o dodanie formatowania, aby bieżący postęp pracy narzędzia był dobrze widoczny. Kierownik poprosił również o dodanie instrukcji dla japońskich użytkowników dotyczących sposobu generowania faktur w języku japońskim.

Ćwiczenie — formatowanie ciągów literałów w języku C#

W tym ćwiczeniu poznasz różne techniki wyświetlania znaków specjalnych i dodawania różnych typów formatowania do danych wyjściowych.

Sekwencje ucieczki znaków

Sekwencja znaków ucieczki to instrukcja dla środowiska uruchomieniowego w celu wstawienia specjalnego znaku, który wpłynie na dane wyjściowe ciągu. W języku C# sekwencja znaków ucieczki rozpoczyna się od ukośnika \ odwrotnego, po którym następuje znak ucieczki. Na przykład sekwencja \n spowoduje dodanie nowego wiersza, a sekwencja \t spowoduje dodanie tabulatora.

Poniższy kod używa sekwencji znaków ucieczki do dodawania nowych linii i kart:

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

Po uruchomieniu kodu zobaczysz następujące dane wyjściowe:

Hello
World!
Hello   World!

Co zrobić, jeśli chcesz wstawić znak podwójnego cudzysłowu w ciągu literału? Jeśli nie używasz sekwencji ucieczki znaków, pomylisz kompilator, ponieważ uważasz, że chcesz przedwcześnie zakończyć ciąg. Kompilator nie rozumie przeznaczenia znaków po drugim podwójnym cudzysłowie.

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

Edytor .NET umieści czerwoną falistą linię pod wyrazem World. Jeśli jednak spróbujesz uruchomić kod, zobaczysz następujące dane wyjściowe:

(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

Aby poradzić sobie z tą sytuacją \" , użyj sekwencji ucieczki:

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

Jeśli uruchomisz powyższy kod, zobaczysz następujące dane wyjściowe:

Hello "World"!

Co zrobić, jeśli chcesz użyć ukośnika odwrotnego do innych celów, na przykład aby wyświetlić ścieżkę pliku?

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

Niestety, język C# zastrzega ukośnik odwrotny dla sekwencji ucieczki, więc jeśli uruchomisz kod, kompilator wyświetli następujący błąd:

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

Problem jest sekwencja \s. Element \r nie generuje błędu, ponieważ jest to prawidłowa sekwencja ucieczki powrotu karetki. Jednak nie chcesz używać powrotu karetki w tym kontekście.

Aby rozwiązać ten problem, użyj polecenia , \\ aby wyświetlić pojedynczy ukośnik odwrotny.

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

Ucieczka od znaku ukośnika odwrotnego powoduje wygenerowanie zamierzonych danych wyjściowych:

c:\source\repos

Formatowanie danych wyjściowych przy użyciu sekwencji ucieczki znaków

  1. Zaznacz cały kod w edytorze .NET, a następnie naciśnij klawisz Delete lub Backspace , aby go usunąć.

  2. Aby utworzyć makiet narzędzia wiersza polecenia, wprowadź następujący kod w edytorze:

    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. Teraz uruchom kod. W konsoli wyjściowej zostanie wyświetlony następujący wynik:

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

Literał ciągu dosłowny

Literał ciągu dosłownego będzie przechowywać wszystkie odstępy i znaki bez konieczności wykonywania ucieczki ukośnika odwrotnego. Aby utworzyć ciąg dosłowny, użyj dyrektywy @ przed ciągiem literału.

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

Zauważ, że ciąg obejmuje dwa wiersze, a odstęp wygenerowany przez tę instrukcję języka C# jest przechowywany w następujących danych wyjściowych.

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

Formatowanie danych wyjściowych przy użyciu literałów ciągu dosłownego

  1. Dodaj następujący wiersz kodu pod utworzonym wcześniej kodem:

    Console.Write(@"c:\invoices");
    
  2. Teraz uruchom kod. Zobaczysz następujący wynik, który zawiera "Katalog wyjściowy":

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

Znaki ucieczki Unicode

Możesz również dodawać zakodowane znaki w ciągach literałów, używając sekwencji ucieczki \u, a następnie 4-znakowego kodu reprezentującego niektóre znaki Unicode (UTF-16).

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

Uwaga

Obowiązują tu pewne zastrzeżenia. Po pierwsze, niektóre konsole, np. wiersz polecenia systemu Windows, nie będą wyświetlały wszystkich znaków Unicode. Zamiast tego zastąpi te znaki znaki znakiem zapytania. Ponadto użyte tutaj przykłady są w formacie UTF-16. Niektóre znaki wymagają formatu UTF-32 i w związku z tym wymagają innej sekwencji ucieczki. Jest to skomplikowany temat, a ten moduł ma jedynie na celu pokazanie, co jest możliwe. W zależności od potrzeb może być konieczne poświęcenie sporej ilości czasu na naukę pracy z znakami Unicode w aplikacjach.

Formatowanie danych wyjściowych przy użyciu znaków ucieczki Unicode

Aby ukończyć pozorowanie narzędzia wiersza polecenia, dodasz frazę w języku japońskim, która tłumaczy: "Aby wygenerować japońskie faktury". Następnie wyświetlisz ciąg literału dosłownego, który reprezentuje polecenie, które użytkownik może wprowadzić. Do formatowania dodasz również kilka sekwencji ucieczki.

  1. Dodaj następujący kod do aplikacji:

    // 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. Aby upewnić się, że kod jest poprawny, porównaj go z następującymi elementami:

    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. Teraz uruchom kod. W konsoli wyjściowej zostanie wyświetlony następujący wynik:

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

Podsumowanie

Poniżej przedstawiono informacje na temat formatowania ciągów literałów do tej pory:

  • Używaj sekwencji ucieczki znaków, gdy chcesz wstawić znak specjalny do ciągu literału, taki jak tabulator \t, nowy wiersz \n lub podwójny cudzysłów \".
  • Używaj znaku ucieczki dla ukośnika odwrotnego \\, gdy chcesz użyć ukośnika odwrotnego we wszystkich innych scenariuszach.
  • Użyj dyrektywy , @ aby utworzyć literał ciągu dosłownego, który przechowuje wszystkie formatowanie białych znaków i ukośnik odwrotny w ciągu.
  • Używaj sekwencji \u i 4-znakowego kodu reprezentującego znaki Unicode (UTF-16) w ciągu.
  • Znaki Unicode mogą nie być poprawnie drukowane w zależności od aplikacji.