문제

사람들이 C++에서 문자열을 소문자/대문자로 변환하는 가장 좋은 방법은 무엇입니까?

C++가 영어 전용 프로그래밍 언어가 아니라는 사실로 인해 문제가 복잡해졌습니다.좋은 다국어 방법이 있나요?

도움이 되었습니까?

해결책

#include <algorithm>
std::string data = "Abc";
std::transform(data.begin(), data.end(), data.begin(), ::toupper);

http://notfaq.wordpress.com/2007/08/04/cc-convert-string-to-upperlower-case/

또한 일반적인 문자열 메서드에 대한 CodeProject 문서는 다음과 같습니다. http://www.codeproject.com/KB/stl/STL_string_util.aspx

다른 팁

> std::string data = “Abc”; 
> std::transform(data.begin(), data.end(), data.begin(), ::toupper);

이것은 작동하지만 표준 "C" 로케일을 사용합니다.다른 로케일에 대해 더 낮은 값을 가져와야 하는 경우 패싯을 사용할 수 있습니다.패싯을 사용하는 위의 코드는 다음과 같습니다.

locale loc("");
const ctype<char>& ct = use_facet<ctype<char> >(loc);
transform(str.begin(), str.end(), std::bind1st(std::mem_fun(&ctype<char>::tolower), &ct));

Nic Strong의 답변을 사용하려는 복사 붙여넣기 사용자의 경우 "use_factet"의 철자 오류와 std::transform에 누락된 세 번째 매개변수를 참고하세요.

locale loc("");
const ctype<char>& ct = use_factet<ctype<char> >(loc);
transform(str.begin(), str.end(), std::bind1st(std::mem_fun(&ctype<char>::tolower), &ct));

해야한다

locale loc("");
const ctype<char>& ct = use_facet<ctype<char> >(loc);
transform(str.begin(), str.end(), str.begin(), std::bind1st(std::mem_fun(&ctype<char>::tolower), &ct));

당신도 검토해야합니다 이 질문.기본적으로 문제는 표준 C/C++ 라이브러리가 유니코드 데이터를 처리하도록 구축되지 않았기 때문에 다른 라이브러리를 찾아야 한다는 것입니다.

이는 C++ 표준이 업데이트되면 변경될 수 있습니다.저는 Borland(CodeGear)의 다음 컴파일러가 유니코드를 지원할 것이라는 것을 알고 있으며 Microsoft의 C++ 컴파일러에도 유니코드를 지원하는 문자열 라이브러리가 있거나 이미 있을 것이라고 추측합니다.

Darren이 말했듯이 가장 쉬운 방법은 std::transform을 사용하는 것입니다.

그러나 독일어와 같은 일부 언어에서는 소문자와 대문자가 항상 일대일로 매핑되는 것은 아닙니다."esset" 소문자(그리스 문자 베타와 유사)는 대문자 "SS"로 변환됩니다.

Boost가 있다면 가장 간단한 방법이 있습니다.보세요 Boost 문자열 알고리즘의 to_upper()/to_lower().

유니코드(및 다국어) 문자의 대소문자를 변환하는 방법을 찾았지만 문자의 로케일을 알고/찾아야 합니다.

#include <locale.h>

_locale_t locale = _create_locale(LC_CTYPE, "Greek");
AfxMessageBox((CString)""+(TCHAR)_totupper_l(_T('α'), locale));
_free_locale(locale);

아직 그렇게 할 수 있는 방법을 못 찾았어요...방법 아는 사람이 있는데 알려주세요.

로케일을 NULL로 설정하면 작동하지 않습니다...

그만큼 VCL 가지고있다 SysUtils.hpp 이는 LowerCase(unicodeStringVar) 그리고 UpperCase(unicodeStringVar) 당신에게 도움이 될 수도 있습니다.저는 이것을 C++ Builder 2009에서 사용합니다.

Steve가 말한 것은 옳지만, 코드가 여러 언어를 지원해야 한다면 해당 언어를 기반으로 관련 toUpper 또는 toLower를 수행하는 일련의 메서드를 캡슐화하는 팩토리 메서드를 가질 수 있을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top