언어/C++

[C++] string 한글 출력

겜도리도리 2022. 7. 15. 23:50
반응형

개요

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바이트도 될 수 있다는 듯?

반응형