728x90
한글로 된 문자를 출력하려고 코드를 작성하던 중,
1byte씩 출력시 비정상적으로 출력 되는 것을 발견 했다.
그 이유는, 한글은 3 byte인데, 1 byte씩 출력하면 깨져서 나오기 때문이다.
string korean = "가나다라";
cout << korean << endl;
cout << korean[0] << " " << endl;
cout << sizeof(korean) << endl;
cout << korean.size() << endl;
다음은 위 코드를 출력 한 결과 이다.
가나다라
�
24
12
만약 한글자씩 이동 또는 출력 하고 싶다면, 3글자씩 묶어서 다음과 같이 처리 해야 한다.
1. 한글자를 출력 하고 싶은 경우
// "가"를 출력 하고 싶을 경우
cout << korean[0] << korean[1] << korean[2] << endl;
2. 한글의 한글자를 다른 한글자와 swap하고 싶은 경우
// "가" 와 "나" 의 순서를 바꾸고 싶은 경우
// 1. 가를 buf에 저장(3개씩 저장)
char buf[3] = {0,};
buf[0] = korean[0];
buf[1] = korean[1];
buf[2] = korean[2];
// 2.나를 가에 저장
korean[0] = korean[3];
korean[1] = korean[4];
korean[2] = korean[5];
// 3. 버퍼에 저장된 가를 나 위치에 저장
korean[3] = buf[0];
korean[4] = buf[1];
korean[5] = buf[2];
// 4.최종 확인
cout << korean << endl;
* 필요시 utf인코딩에 맞는 string을 선택하면, 더욱 쉽게 처리 할 수 있다.
std::string | std::basic_string<char> | |
std::wstring | std::basic_string<wchar_t> | wchar_t 의 크기는 시스템 마다 다름. 윈도우에서는 2 바이트이고, 유닉스 시스템에서는 4 바이트 |
std::u8string | std::basic_string<char8_t> | C++ 20 에 새로 추가되었음; char8_t 는 1 바이트; UTF-8 문자열을 보관할 수 있음 |
std::u16string | std::basic_string<char16_t> | char16_t 는 2 바이트; UTF-16 문자열을 보관할 수 있음 |
std::u32string | std::basic_string<char32_t> | char32_t 는 4 바이트; UTF-32 문자열을 보관할 수 있음 |
728x90