Cvičení – kombinování řetězců pomocí řídicích sekvencí znaků

Dokončeno

Předpokládejme, že jste byli požádáni o vytvoření napodobení nástroje příkazového řádku, který vygeneruje faktury v angličtině i japonštině. Nemusíte zatím vytvářet přímo funkce, které by vygenerovaly samotné faktury. Rozhraní příkazového řádku potřebujete poskytnout jenom interním zákazníkům ve fakturačním oddělení pro jejich schválení. Vedoucí vás požádal, abyste přidali formátování, které bude jasně ukazovat aktuální stav tohoto nástroje. Také je potřeba poskytnout pokyny pro japonské uživatele, jak generovat faktury, a to v japonštině.

Cvičení – formátování řetězců literálů v jazyce C#

V tomto cvičení se naučíte různé techniky zobrazení speciálních znaků a přidání různých typů formátování do výstupu.

Řídicí sekvence znaků

Řídicí sekvence znaků je instrukce modulu runtime pro vložení speciálního znaku, který ovlivní výstup řetězce. V jazyce C# sekvence řídicích znaků začíná zpětným lomítkem \ následovaným znakem, který chcete shrnout. Například sekvence \n přidá nový řádek a sekvence \t tabulátor.

Následující kód používá sekvence řídicích znaků k přidání novýchřádků a tabulátorů:

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

Pokud kód spustíte, uvidíte následující výstup:

Hello
World!
Hello   World!

Co když potřebujete do literálového řetězce vložit uvozovky? Pokud řídicí sekvenci znaků nepoužíváte, zmást kompilátor, protože si myslíte, že chcete řetězec předčasně ukončit. Kompilátor nerozumí účelu znaků za druhou uvozovku.

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

Editor .NET vloží červenou vlnovku pod řetězec World. Pokud se ale přesto pokusíte kód spustit, zobrazí se následující výstup:

(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

Pokud chcete tuto situaci zvládnout, použijte \" řídicí sekvenci:

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

Pokud spustíte výše uvedený kód, zobrazí se následující výstup:

Hello "World"!

Co dělat v případě, že zpětné lomítko potřebujete pro jiné účely, například k zobrazení cesty k souboru?

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

Jazyk C# bohužel vyhrazuje zpětné lomítko pro řídicí sekvence, takže pokud spustíte kód, kompilátor zobrazí následující chybu:

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

Problém je v sekvenci \s. Nevygeneruje \r chybu, protože se jedná o platnou řídicí sekvenci pro návrat na začátek řádku. V tomto kontextu ale nechcete používat návrat na začátek řádku.

Chcete-li tento problém vyřešit, použijte \\ k zobrazení jednoho zpětného lomítka.

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

Zapouzdření zpětného lomítka vytvoří výstup, který jste chtěli:

c:\source\repos

Formátování výstupu pomocí řídicích sekvencí znaků

  1. Vyberte veškerý kód v editoru .NET a stisknutím klávesy Delete nebo Backspace ho odstraňte.

  2. Pokud chcete vytvořit mockup nástroje příkazového řádku, zadejte do editoru následující kód:

    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. Teď tento kód spusťte. Na výstupní konzole uvidíte následující výsledek:

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

Doslovný řetězcový literál

Doslovný řetězcový literál zachovává všechny mezery a znaky bez nutnosti použít řídicí znak (zpětné lomítko). Pokud chcete vytvořit doslovný řetězec, použijte před řetězcem literálu direktivu @.

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

Všimněte si, že se řetězec v následujícím výstupu vygenerovaném touto instrukcí C# roztáhne na dva řádky a zachovají se mezery.

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

Formátování výstupu pomocí doslovných řetězcových literálů

  1. Pod kód, který jste vytvořili dříve, přidejte následující řádek kódu:

    Console.Write(@"c:\invoices");
    
  2. Teď tento kód spusťte. Zobrazí se následující výsledek, který obsahuje výstupní adresář:

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

Řídicí znaky Unicode

Do řetězců literálů můžete také přidat kódované znaky, a to s použitím řídicí sekvence \u, po které následuje čtyřmístný kód představující nějaký znak v kódování Unicode (UTF-16).

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

Poznámka:

Je s tím spojeno několik zádrhelů. Zaprvé, některé konzoly, jako je příkazový řádek Windows, znaky Unicode nezobrazují. Místo toho nahradí tyto znaky otazníkem. Navíc se tady použité příklady týkají kódování UTF-16. Některé znaky vyžadují kódování UTF-32 a tím i jinou řídicí sekvenci. To je složité téma a cílem tohoto modulu je jen ukázat, co je možné. V závislosti na konkrétních potřebách možná budete muset věnovat nějaký čas tomu, abyste se naučili používat znaky Unicode ve svých aplikacích.

Formátování výstupu pomocí řídicích znaků unicode

K dokončení napodobení nástroje příkazového řádku přidáte frázi v japonštině, která překládá: "Generování japonských faktur". Pak zobrazíte doslovný literálový řetězec, který představuje příkaz, který může uživatel zadat. Přidáte také několik řídicích sekvencí pro formátování.

  1. Do aplikace přidejte následující kód:

    // 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. Abyste měli jistotu, že je váš kód správný, porovnejte ho s následujícími:

    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. Teď tento kód spusťte. Na výstupní konzole uvidíte následující výsledek:

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

Rekapitulace

Tady je, co jste se zatím naučili o formátování literálových řetězců:

  • Pokud potřebujete do řetězce literálu vložit speciální znak, jako je tabulátor \t, nový řádek \n nebo dvojité uvozovky \", použijte řídicí sekvence znaků.
  • Pokud potřebujete použít zpětné lomítko v jakékoli jiné situaci, použijte jeho řídicí znak \\.
  • Direktiva @ slouží k vytvoření doslovného řetězcového literálu, který uchovává veškeré formátování prázdných znaků a zpětné lomítko v řetězci.
  • Pokud chcete v řetězci vyjádřit znaky Unicode (UTF-16), použijte řídicí znak \u a příslušný čtyřmístný kód.
  • Znaky Unicode se nemusí správně tisknout v závislosti na aplikaci.