[1. 개요]
멀티바이트 문자열에서 wide char 문자열로 변환 혹은 그 반대 방향으로 변환 시 주의 점.
- Locale 에 대한 이해
- 인코딩 변경이므로, 데이터 인코딩이 적절한지 확인
- 출력에 관하여.
[2. Locale 에 대한 이해]
리눅스 기준으로는
- locale -a 를 이용하여, 현재 시스템에 설치된 locale 을 확인 할 수 있다.
- # locale-gen ko_KR.UTF-8 을 이용해서 한국어 관련 locale 을 설치 할 수 있다.
윈도우에서 파워 쉘 기준으로는
- Get-WinSystemLocale 명령어로 확인 가능
[3. 리눅스 관련 코드]
#include <iostream>
#include <clocale>
#include <cstdlib>
#include <string>
#include <cstring>
int main()
{
wchar_t wstr[128];
std::string str = "안녕하세요";
// 시스템에 설치된 locale 을 확인한다.
if(!std::setlocale(LC_CTYPE, "ko_KR.utf8")) {
std::cout << "setlocale fail\n";
return 1;
} else {
//std::wcout.imbue(std::locale("ko_KR.utf8"));
}
memset(wstr, 0, sizeof(wstr));
// 멀티바이트 -> 와이드 캐릭터로
// 입력 데이터는 utf8 로 인코딩 되어 있어야 한다.
const auto result = std::mbstowcs(wstr, str.c_str(), 128);
if (result == (std::size_t)(-1)) {
std::cout << "fail\n";
}
else {
std::cout << "success " << result << "\n";
for (int i=0; i<result; i++) {
std::cout << int(wstr[i]) << " ";
}
std::cout << std::endl;
// 가급적 std::wcout 과 std::cout 은 혼욯하여 사용하지 않는다.
//std::wcout << wstr << L"\n";
//std::wcout.flush();
char mbstr[128];
memset(mbstr, 0, sizeof(mbstr));
// wide char -> utf8 로 변환
std::wcstombs(mbstr, wstr, 128);
std::cout << mbstr << std::endl;
}
return 0;
}
[4. 윈도우 관련 코드]
#include <iostream>
#include <clocale>
#include <cstdlib>
#include <string>
#include <cstring>
// 이 소스코드는 euc-kr 로 인코딩되어야 한다.
int main()
{
wchar_t wstr[128];
std::string str = "안녕하세요";
if(!std::setlocale(LC_CTYPE, "Korean_Korea.949")) {
std::cout << "setlocale fail\n";
return 1;
} else {
//std::wcout.imbue(korean_locale);
}
memset(wstr, 0, sizeof(wstr));
const auto result = std::mbstowcs(wstr, str.c_str(), 128);
if (result == (std::size_t)(-1)) {
std::cout << "mbstowcs fail\n";
}
else {
std::cout << "mbstowcs success " << result << "\n";
for (int i=0; i<result; i++) {
std::cout << int(wstr[i]) << " ";
}
std::cout << std::endl;
char mbstr[128];
memset(mbstr, 0, sizeof(mbstr));
std::wcstombs(mbstr, wstr, 128);
std::cout << mbstr << std::endl;
}
return 0;
}
'C++' 카테고리의 다른 글
Placement new (0) | 2025.05.28 |
---|---|
wchar_t 사용과 관련하여. (0) | 2025.05.12 |
std::bind (0) | 2025.04.28 |
bitfield 사용 시 유의할 점 (0) | 2025.04.28 |
OS 별 select() 함수 사용법 (0) | 2025.04.24 |