2010-03-17 5 views
4

C++에서 현재의 문자 세트가 무엇인지 어떻게 알 수 있습니까? 콘솔 응용 프로그램에서 C++에서 현재의 문자 세트가 무엇인지 어떻게 알 수 있습니까?

은 (WINXP는) 내가

(int)mystring[a] 

와 (äöüé 같은) 일부 문자 음의 값을 얻고이 나를 놀라게한다. 127과 256 사이의 값을 기대하고 있었다.

그래서 GetCharset()이나 SetCharset() 같은 것을 C++에서 사용할 수 있는가?

+2

미스터 링은 어떤 유형입니까? –

+0

당신은 어떤 가치를 기대 했습니까? 현재 로케일을 가져온 다음 해당 로케일 및 인코딩에 해당하는 글리프 ID (느슨하게 말하면)를 찾을 수 있습니다. 대부분의 경우, 글리프 ID는 시스템에서 'int'가 보유 할 수있는 것보다 큽니다. 또한,'mystring '이'wstring' 타입이라면, 멀티 바이트 문자 인코딩을 고려할 필요가 있습니다. – dirkgently

+0

Daniel Daranas mystring은 std :: string – Stef

답변

5

당신이 가진 가치를 어떻게 보는가에 달려 있습니다. char은 다른 시스템 에서처럼 서명 (예 : Windows)되거나 서명되지 않은 것일 수 있습니다. 그래서, 당신이해야 할 일은 당신이 요구하는 것을 얻기 위해 값을 unsigned로 출력하는 것입니다.

지금까지 C++는 char-set agnostic입니다. Windows 콘솔의 경우 특별히 다음을 사용할 수 있습니다. GetConsoleOutputCP.

+0

첫 번째 질문에 답했기 때문에 나는이 대답을 올바르게 취하고 있습니다. 신비의 나머지는 여전히 수수께끼로 남아 있습니다 ...그것은 서명 된 또는 서명되지 않은 int에 관한 것이 아닙니다 ... – Stef

1

std::numeric_limits<char>::min()max()을 확인하십시오. 입력이 마음에 들지 않거나 정수 상수 표현식이 필요한 경우 CHAR_MINCHAR_MAX입니다.

CHAR_MAX == UCHAR_MAXCHAR_MIN == 0 인 경우 문자는 예상 한대로 서명되지 않습니다. CHAR_MAX != UCHAR_MAXCHAR_MIN < 0 인 경우 서명합니다 (보고있는대로).

표준 3.9.1/1에서는 다른 가능성이 없음을 보장합니다. "... 일반 char는 서명 된 char 또는 unsigned char과 동일한 값을 취할 수 있으며 어느 것이 구현 정의됩니까? . "

char이 서명되었거나 서명되지 않았는지 여부를 알려주며 혼란을 야기합니다. 당신은 확실히 어떤 것을 호출 할 수 없습니다 : 프로그램의 POV로부터 컴파일러가 그것을 변경하는 방법을 가지고있다하더라도 (GCC는 확실히 : -fsigned-char-funsigned-char) 컴파일러에 구운 것입니다.

charint으로 전송하려는 경우 먼저 unsigned char을 통해 전송해야합니다. 따라서 귀하의 예에서는 (int)(unsigned char)mystring[a]입니다. 이렇게하면 음이 아닌 값을 얻을 수 있습니다.

구현시 char에 대해 사용하는 문자셋을 실제로 알려주지는 않지만 실제로 알 필요는 없다고 생각합니다. Microsoft 컴파일러에서 대답은 본질적으로 일반적으로 사용되는 문자 인코딩 "ISO-8859-mutter-mutter"입니다. 즉, 7 비트 ASCII 값이있는 문자는 해당 값으로 표시되지만 해당 범위를 벗어나는 값은 모호하며 콘솔이나 다른받는 사람이받는 사람의 구성 방식에 따라 해석됩니다. ISO 라틴어 1 달리 언급하지 않는 한.

정확하게 말해서, 문자가 해석되는 방식은 로케일에 따라 다르며, 로켈은 개인적으로 결코 통과하지 못했던 C++ 표준의 끝 부분에있는 수많은 재료를 사용하여 수정하고 심문 할 수 있습니다 advice on ;-)

효과가있는 charset과 콘솔이 사용하는 charset이 일치하지 않으면 문제가 발생할 수 있습니다. 하지만 chars가 음수가 될 수 있는지 여부는 chars와는 아무 관련이 없습니다. char가 서명되었는지 여부는 문제가 아닙니다.

0

표준이 제공하는 유일한 것은 보증되는 기본 문자 세트의 구성원 :

2.2 문자

3 설정 기본 실행 문자 상기 기본 실행 설정된 와이드 문자 세트는 각각 기본 소스 문자 세트 , 의 모든 멤버를 포함하고 제어 문자는 을 나타내며, 백 스페이스 및 캐리지 리턴, 에 null 문자 (각각 널 문자)를 더한 것입니다.이 문자의 표현은 모두 제로 비트입니다. 각각의 기본 실행 문자 집합 의 경우 구성원의 값은 이 아닌 이고 음수가 아닌 값이어야합니다. 원본 및 실행 기본 문자 집합 모두에서 위의 위의 10 진수 목록에서 0 이후의 각 문자의 값은 보다 큰 값인 이되어야합니다. 실행 문자 집합 및 실행 와이드 문자 집합 은 기본 실행 문자 집합과 기본 실행 와이드 문자 집합의 상위 집합입니다. 실행 문자 세트 멤버의 값 구현 정의하고, 어떤 추가 회원

은 또한, 유형 char을 보유하도록되어 로케일 특정 :

3.9.1 기본 유형

문자로 선언 된 개체 (char) 구현의 기본 문자 문자 집합을 저장할 수있을만큼 커야합니다.

귀하가 언급 한 문자에 대한 올바른 가치를 부여 할 수있는 보장이 없습니다. 그러나 unsigned int을 사용하여이 값을 유지하십시오 (모든 인쇄용으로는 인쇄용/전달시 char 값을 보유하기 위해 서명 된 유형을 사용하는 것이 결코 바람직하지 않습니다).

+0

"문자 값을 유지하기 위해 서명 된 유형을 사용하는 것은 결코 바람직하지 않습니다"불행히도, 문자를 처리하기위한 모든 C 표준 라이브러리 함수는 정확히 동일합니다. –

+0

그것들은 그렇지만'toupper ((unsigned char) c);와 같이'int c = getchar();'를 사용하는 것이 좋을 것입니다 ... – dirkgently

+0

동의 함 (제 대답 참조). 당신은 어떤 점에서 부호없는 타입을 도입해야합니다. 내가 맹금하고있는 것은'unsigned int'가 값을 유지해야하는지 (완벽하게 감지 할 수있는 다른 모든 것이 동일 함),'unsigned char'가 int '(C- 라이브러리 - 관용구). –

0

문자는 기본적으로 기본적으로 서명됩니다. 시도해보십시오.

cout << (unsigned char) mystring[a] << endl; 
관련 문제