2013-07-22 3 views
1

일부 환경에서는 std::string이 내부적으로 UTF-8을 사용합니다. 반면, 내 플랫폼에서 Windows는 std::string은 ASCII 전용입니다. 이 동작은 std::locale을 사용하여 변경할 수 있습니다. STL의 제 버전에는 문자열에 사용할 UTF-8 패싯이 없거나 적어도 찾을 수 없습니다. 그러나 나는 fstream 클래스 집합과 함께 사용할 패싯이 있습니다.기본적으로 utf8을 처리하는 스트림

편집 : "내부에서 UTF-8 사용"이라고 말하면 어떤 환경에서는 UTF-8 인코딩 된 문자열을 허용하는 std::basic_filebuf::open()과 같은 메서드를 참조하고 있습니다. 나는 이것이 실질적으로 std::string 문제가 아니라 오히려 어떤 OS가 기본적으로 UTF-8을 사용한다는 것을 안다. 내 질문은 "귀하의 구현이 잘못된 시퀀스의 코드 변환을 어떻게 처리합니까?"로 읽어야합니다.

이 스트림은 다른 플랫폼/구현에서 잘못된 코드 시퀀스를 어떻게 처리합니까?

UTF8facet 파일의 경우 오류를 반환하기 만하면 더 이상 스트림을 읽을 수 없습니다. 나는 유니 코드 "잘못된 char"0xfffd 값을 더 나은 옵션으로 변경하려고 생각했을 것이다.

제 질문은 UTF-8으로 제한되지 않습니다. UTF-16 서로 게이트 쌍을 잘못 입력하셨습니까?

예를 들어 보겠습니다. UTF-8에서 wchar_tlocale까지 UTF-8 인코딩 파일을 열어 봅시다. 구현시 유효하지 않은 UTF-8 시퀀스가 ​​어떻게 처리됩니까? std::wstring을 입력하고 std::cout으로 인쇄하십시오. 이번에는 단독 대리인으로 인쇄하십시오.

+0

사용 사례에 따라 다릅니다. 때로는 오류가 신호로 전달되기를 원할 수도 있습니다 (잘못된 데이터가 완전히 받아 들여지지 않을 때). 때로는 U + FFFD를 원한다. 간혹 나쁜 데이터를 버리기를 원할 때가 있습니다. 때로는 다른 것을 원합니다. –

+0

@ R.MartinhoFernandes 구현을 통해 최소한 이러한 상황을 처리하는 방법을 알려줄 수 있습니까? – Twifty

+0

예에서 정확한 코덱 패턴을 알려주시겠습니까? 그것입니다 :'std :: codecvt_utf8 '? - 정확한 흐름은 무엇입니까? 'std :: wifstream'? 어떤 정확한 문자열 유형을 사용할 계획입니까? 'std :: wstring' 또는'std :: string'? –

답변

1

UTF-8에서 wchar_t 로케일로 UTF-8로 인코딩 된 파일을 여는 경우, 구현시 유효하지 않은 UTF-8 시퀀스는 어떻게 처리됩니까?

일반적으로 아무도 다른 플랫폼에서 wchar_t 또는 다른 넓은 문자 형식으로 변환하여 귀찮게하지 않지만이 모두 사용할 수있는 표준 측면 오류가 해제 될 때까지 스트림 작동이 중지됩니다 읽기 오류 신호 .

+0

내가 표준에서 모을 수있는 한, 이것이 필요한 행동입니다. –

0

std::string은 인코딩 할 수없는 문자 여야합니다 : http://en.cppreference.com/w/cpp/string/basic_string - 코드 포인트/데이터의 유효성을 검사하면 안됩니다. 따라서 이진 데이터를 저장할 수 있어야합니다.

인코딩이 실제로 차이를 만드는 유일한 장소는 문자열 길이를 계산하고 문자열별로 문자를 반복하는 것입니다. 로캘은 이러한 경우에 영향을 미치지 않습니다.

std::locale의 사용은 모든 플랫폼 또는 모든 표준 라이브러리 구현에서 스레드로부터 안전하지 않으므로 사용하지 않는 것이 좋습니다. 사용하지 않을 경우주의해야합니다. 이것의 효과는 또한 매우 제한적이며 아마도 당신이 기대하는 바가 전혀 아닙니다.

+0

이것은 내 질문에 답하지 않고 관련이 없으며 잘못되었습니다. 'locale '의 효과는 매우 명확하며 대부분의 스트림 처리 작업에서도 필요합니다. – Twifty

+1

@Waldermort 아니요, 틀린 것은 아닙니다.'std :: string'는 실제로 문자 인코딩을 전혀 모르고 걱정하지 않습니다. "내부 인코딩"이 없습니다. 그것은 매우 많은 바이트 컨테이너입니다. 예를 들어,'std :: string :: length()'는 항상 문자 수가 아닌 바이트 수를 반환합니다. – JohannesD

+0

@JohannesD'std :: string'에 대해서는 묻지 않고 문자 인코딩을 처리하고 있습니다. 또한 기술적으로 올바르지 만'wstring' 또는 바이트 수를 반환하지 않는 C++ 11 16/32 비트 문자열은 고려하지 않습니다.) – Twifty

3

일부 환경에서는 std :: string이 내부적으로 UTF-8을 사용합니다.

C++ 프로그램은 표준 호환 플랫폼에서 UTF-8 문자열을 보유하기 위해 std::string을 사용할 수 있습니다.

내 플랫폼에서 Windows의 std :: string은 ASCII입니다.

정확하지 않습니다. Windows에서 std::string을 사용하여 원하는 경우 UTF-8 문자열을 저장할 수 있습니다. std::string은 표준 호환 플랫폼에서 ASCII를 보유하는 것으로 제한되지 않습니다.

이 동작은 std :: locale을 사용하여 변경할 수 있습니다.

아니요, 아니요, std::string의 동작은 로캘 라이브러리의 영향을받지 않습니다.

std::stringchars의 시퀀스이다. Windows를 포함한 대부분의 플랫폼에서 char은 8 비트입니다. 따라서 std::string을 사용하여 ASCII, Latin1, UTF-8 또는 8 비트 이하 코드 단위를 사용하는 문자 인코딩을 보유 할 수 있습니다. std::string::length은 보유한 코드 단위 수를 반환하고 std::string::operator[]은 i 번째 코드 단위를 반환합니다.

UTF-16을 보유하려면 char16_tstd::u16string을 사용할 수 있습니다.

UTF-32를 보유하려면 char32_tstd::u32string을 사용할 수 있습니다.

관련 문제