반응형
개요
C++에서 string으로 한글을 출력할 때 깨지는 오류가 있었다. 관련해서 디버깅해보던 중에 한글이 2바이트... 인걸 깨닫게 되어 정리해본다.
예제
다음과 같은 코드의 출력 결과는 어떻게 될까?
1의 결과로는 "심"이 출력되고
2의 결과로는 3(심건우가 3글자이므로)이라고 생각하기 쉽다.
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s = "심건우";
cout << s[0] << '\n'; // 1.
cout << s.length() << '\n'; // 2.
return 0;
}
실제로는 다른 결과가 출력된다. 1의 결과는 이상한 값, 2의 결과는 6이 나온다. 이 문제는 한글이 2바이트기 때문에 발생한다.
한글은 아스키코드에 포함되어 있지 않으므로 1바이트로는 표시할 수 없고, 유니코드를 사용해 2바이트로 표시해야한다.
1 : 한글은 2바이트기 때문에 s[0]값만 가져오면 문제가 발생한다. "심"을 얻고 싶다면 2바이트 모두 가져와 s[0], s[1] 모두 출력해줘야한다.
2 : 마찬가지로 한글은 2바이트기 때문에 총 문자열의 길이는 2 * 3 = 6이다.
제대로 "심"을 출력해주려면 다음과 같이 바꿔줘야한다.
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s = "심건우";
cout << s[0] << s[1] << '\n';
cout << s.length() << '\n';
return 0;
}
정상적으로 "심"이 출력되는 모습.
깔끔하게 모두 출력해주려면 substr등을 사용하면 될 듯 하다.
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s = "심건우";
for (int i = 0; i < (int)s.length(); i += 2)
{
cout << s.substr(i, 2);
}
return 0;
}
주의사항
항상 한글이 2바이트인 것은 아닌듯 하다. Visual Studio 환경에서는 2바이트로 표시되는데, 개발 환경에 따라 3바이트도 될 수 있다는 듯?
반응형
'언어 > C++' 카테고리의 다른 글
[C++] 상수 및 비상수 멤버 함수에서 코드 중복 현상 피하기 (0) | 2022.07.22 |
---|---|
[C++] Inline 함수 (0) | 2022.07.19 |
[C++] 프로그램 실행 순서 (0) | 2022.07.13 |
[C++] 가상 함수 (virtual) (0) | 2022.07.10 |
[C++] Vector 원소 삭제(erase, remove) (0) | 2022.07.05 |