연습 - 문자 이스케이프 시퀀스 및 축자 문자열

관리자가 영어와 일본어로 송장을 생성하는 명령줄 도구의 모형을 만들도록 요청했다고 가정합니다. 아직 송장을 생성하는 실제 기능을 빌드할 필요는 없습니다. 승인을 위해 청구 부서의 내부 고객에게만 명령줄의 사용자 인터페이스를 제공해야 합니다. 관리자가 도구의 현재 진행 상태를 돋보이게 보여주는 서식을 추가하라고 요청했습니다. 또한 일본어 사용자에게 일본어로 송장 생성 방법을 알려주는 지침을 제공하라고 요청했습니다.

C#으로 리터럴 문자열 서식 지정

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단계 - 문자 이스케이프 시퀀스를 사용하여 명령줄 애플리케이션의 출력 서식 지정

명령줄의 모형을 만들려면 편집기에서 다음 코드를 추가합니다.

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:   

축자 문자열 리터럴

축자 문자열 리터럴은 백슬래시를 이스케이프할 필요 없이 모든 공백과 문자를 유지합니다. 축자 문자열을 만들려면 리터럴 문자열 앞에서 @ 지시문을 사용합니다.

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

문자열은 두 줄로 나뉘어 있으며 이 C# 명령에 의해 생성된 공백은 다음 출력에서 유지됩니다.

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

2단계 - 축자 리터럴 문자열을 사용하여 명령줄 애플리케이션의 출력 서식 지정

1단계에서 추가한 코드 아래에 다음 코드 줄을 추가합니다.

Console.Write(@"c:\invoices");

이제 코드를 실행하면 "출력 디렉터리" 명령을 포함하는 다음과 같은 출력이 표시됩니다.

Generating invoices for customer "ABC Corp" ...

Invoice: 1021       Complete!
Invoice: 1022       Complete!

Output Directory:   
c:\invoices

유니코드 이스케이프 문자

\u 이스케이프 시퀀스를 사용하여 리터럴 문자열에 인코딩된 문자를 추가한 다음 유니코드(UTF-16)의 일부 문자를 나타내는 네 문자 코드를 추가할 수도 있습니다.

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

참고

몇 가지 주의 사항이 있습니다. 먼저 Windows 명령 프롬프트와 같은 일부 콘솔에는 유니코드 문자가 모두 표시되지 않습니다. 해당 문자가 물음표 문자로 바뀝니다. 또한 여기에 사용된 예는 UTF-16입니다. 일부 문자의 경우 UTF-32가 필요하므로 다른 이스케이프 시퀀스가 필요합니다. 이는 복잡한 주제이며 이 모듈에서는 가능한 항목만 보여주려고 합니다. 필요에 따라 애플리케이션에서 유니코드 문자를 학습하고 사용하는 데 많은 시간이 소요될 수 있습니다.

3단계 - 유니코드 이스케이프 문자를 사용하여 명령줄 애플리케이션의 출력 서식 지정

명령줄 사용자 인터페이스 모형을 완료하려면 "일본어 송장을 생성하려면"으로 해석되는 일본어 문구를 추가한 다음 플래그를 사용하여 애플리케이션 실행 파일에 축자 리터럴 문자열을 제공합니다. 또한 서식 지정을 위한 일부 이스케이프 시퀀스를 추가합니다.

애플리케이션에 다음 코드를 추가합니다.

// 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");

전체 코드 예는 다음과 같습니다.

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, 큰따옴표 \" 등과 같은 특수 문자를 리터럴 문자열에 삽입해야 하는 경우 문자 이스케이프 시퀀스를 사용합니다.
  • 다른 모든 시나리오에서 백슬래시를 사용해야 하는 경우 백슬래시 \\에 이스케이프 문자를 사용합니다.
  • 문자열에서 모든 공백 서식과 백슬래시 문자를 유지하려면 축자 문자열 리터럴을 만듭니다.
  • 문자열에서 유니코드 문자(UTF-16)를 나타내려면 \u와 네 문자 코드를 사용합니다.
  • 유니코드 문자는 애플리케이션에 따라 제대로 출력되지 않을 수 있습니다.