C++에서 문자열을 소문자로 변환하는 방법

Jinku Hu 2023년12월11일
C++에서 문자열을 소문자로 변환하는 방법

이 기사에서는 C++에서 문자열을 소문자로 변환하는 방법을 소개하겠다.

C++에서 문자열 변환을 수행하기 전에 먼저 자신에게 물어봐야 할 것은 내 입력 문자열의 인코딩 종류는 무엇인가? 왜냐하면 만약 당신이 멀티바이트 인코딩 문자에 std::lower를 사용한다면, 당신은 분명히 버기 코드를 얻게 될 것이기 때문이다.

std::string 소문자 변환을 깔끔하게 구현한 것처럼 보이지만 인코딩이 UTF-8이기 때문에 모든 문자를 소문자로 변환하지는 않는다.

#include <algorithm>
#include <iostream>

std::string toLower(std::string s) {
  std::transform(s.begin(), s.end(), s.begin(),
                 [](unsigned char c) { return std::tolower(c); });
  return s;
}

int main() {
  std::string string1 = u8"ÅSH to LoWer WÅN";
  std::cout << "input string:  " << string1 << std::endl
            << "output string: " << toLower(string1) << std::endl;
  return 0;
}

위의 코드는 ASCII 문자열과 다른 비 ASCII 문자열에도 잘 작동하지만, 일단 좀 특이한 입력을 하면, 라틴어 기호를 입력하면 출력이 만족스럽지 않을 것이다.

출력:

input string:  ÅSH to LoWer WÅN
output string: Åsh to lower wÅn

Å 기호를å로 낮춰야하므로 잘못되었습니다. 그렇다면 올바른 출력을 얻기 위해이 문제를 어떻게 해결할 수 있습니까?

이 작업을 수행하는 가장 좋은 이식 방법은 안정성을 제공하고 광범위하게 액세스 할 수있을만큼 성숙하고 코드를 교차 플랫폼에 유지하는ICU (International Components for Unicode) 라이브러리를 사용하는 것입니다.

우리는 다음의 헤더만 우리의 소스 파일에 포함시키면 된다. 이 도서관들은 이미 당신의 플랫폼에 포함되어 있고 이용할 수 있기 때문에 코드 샘플은 잘 작동될 것이다. 그러나 IDE/컴파일 시간 오류가 발생하면 ICU 설명서 웹 사이트)에서 라이브러리를 다운로드하는 지침을 참조하십시오.

#include <unicode/locid.h>
#include <unicode/unistr.h>
#include <unicode/ustream.h>

헤더를 포함했으므로, 다음과 같이 소문자 변환 코드에 std::string을 쓸 수 있다.

#include <unicode/locid.h>
#include <unicode/unistr.h>
#include <unicode/ustream.h>

#include <iostream>

int main() {
  std::string string1 = u8"ÅSH to LoWer WÅN";
  icu::UnicodeString unicodeString(string1.c_str());
  std::cout << "input string:  " << string1 << std::endl
            << "output string: " << unicodeString.toLower() << std::endl;
  return 0;
}

ICU 라이브러리 종속성을 포함하도록 다음과 같은 컴파일러 플래그를 사용하여 이 코드를 컴파일해야 한다는 점에 유의하십시오.

g++ sample_code.cpp -licuio -licuuc -o sample_code

코드를 실행하면 예상대로 정확한 출력을 얻을 수 있다.

input string:  ÅSH to LoWer WÅN
output string: åsh to lower wån

동일한 함수는 일반적으로 사용자 입력으로 기대하지 않는 일부 다른 언어를 처리할 수 있으며 로케일을 toLower 함수의 매개 변수로 명시적으로 지정할 수도 있다.

#include <iostream>
#include <unicode/unistr.h>
#include <unicode/ustream.h>
#include <unicode/locid.h>

int main() {
    std::string string2 = "Κάδμῳ ἀπιϰόμενοι.. Ελληνας ϰαὶ δὴ ϰαὶ γράμματα, οὐϰ ἐόντα πρὶν Ελλησι";
    icu::UnicodeString unicodeString2(string2.c_str());
    std::cout  << unicodeString2.toLower("el_GR") << std::endl;
    return 0;
}
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

관련 문장 - C++ String