std::vprint_unicode

std::vprint_unicode (유니코드 형식화 출력 삽입)

형식 문자열 fmt에 따라 args를 포맷하고 결과를 os 출력 스트림에 쓰는 함수예요. 유니코드(네이티브 Unicode API)를 지원하는 터미널용이에요. C++23부터 있어요.

출처: cppreference

본문

<ostream> 헤더에 정의돼 있고, std::vformat의 유니코드 출력 스트림 버전이에요.

void vprint_unicode( std::ostream& os,
                     std::string_view fmt, std::format_args args );

형식 문자열 fmt에 따라 args를 포맷하고 결과를 os 출력 스트림에 써요. osFormattedOutputFunction처럼 동작해요(단, 오류 보고의 일부 세부 사항은 다를 수 있어요). 다음 연산을 순서대로 수행해요.

  • 먼저 sentry 객체를 만들고 검사해요.
  • std::string out = std::vformat(os.getloc(), fmt, args);처럼 자동 변수를 초기화해요.
  • outos에 써요.
    • os가 네이티브 Unicode API를 통해서만 유니코드를 표시할 수 있는 터미널을 가리키면, os를 비우고 네이티브 Unicode API로 out을 터미널에 써요.
    • 그렇지 않으면 문자 시퀀스 [out.begin(), out.end())os에 삽입해요.

터미널에 쓰거나 os에 삽입하는 게 실패하면 os.setstate(std::ios_base::badbit)를 호출해요. C++26부터 os에 문자를 쓴 뒤 관찰 가능한 체크포인트를 설정해요. 네이티브 Unicode API를 쓸 때 out에 잘못된 유니코드 코드 단위가 있으면 동작이 정의되지 않아요.

매개변수

  • os: 데이터를 삽입할 출력 스트림.
  • fmt: 형식 문자열 (표준 std::format 문법). args: 포맷할 인자들.

형식 문자열은 {}로 감싼 replacement field를 쓰며, arg-idformat-spec 지정을 따르고 인자 타입에 따라 해석돼요.

예외

  • 할당 실패 시 std::bad_alloc.
  • 어떤 formatter가 던지는 예외(예: std::format_error)는 os.exceptions() 값과 무관하게 전파돼요.
  • os로의 삽입이 실패하면 호출되는 os.setstate(ios_base::badbit) 때문에 생기는 ios_base::failure를 던질 수 있어요.

참고

네이티브 Unicode API를 호출할 때 트랜스코딩이 필요하면, 잘못된 코드 단위는 U+FFFD REPLACEMENT CHARACTER로 대체돼요("The Unicode Standard - Core Specification" 3.9장 참조).

피처 테스트 매크로 __cpp_lib_print(값 202207L, C++23)와 __cpp_lib_format(값 202207L, C++23)이 있어요.

결함 보고로 LWG 4044(C++23, os가 가리키는 터미널이 유니코드를 표시할 수 있으면 네이티브 Unicode API를 항상 사용했음 → 네이티브 Unicode API로만 표시할 수 있을 때만 사용)가 있어요.

더 알아보기 (Learn more)

cppreference