2017-11-07 19 views
1

나는 코드화와의 std :: string 비교에 문제가 있다고 생각합니다. 문제는 내가받는 문자열을 비교하는 것을 싫어한다는 것입니다. 그리고 나는 그것이 얼마나 성질이 좋지 않은 문자가있는 스페인어 문자열과 함께 성문화의 종류를 알지 못합니다. 나는 s_area.m_s_area_text를 바꿀 수 없기 때문에 s2 문자열을 동일한 값으로 설정해야하고 다른 체이스를위한 일반적인 방법으로 그것을 수행하는 방법을 모른다.C++ std : string 비교 코드화 문제

std::string s2= "Versión de sistema"; 
std::cout << s_area.m_s_area_text << std::endl; 

for (const char* p = s2.c_str(); *p; ++p) 
{ 
    printf("%02x", *p); 
} 
printf("\n"); 


for (const char* p = s_area.m_s_area_text.c_str(); *p; ++p) 
{ 
    printf("%02x", *p); 
} 
printf("\n"); 

하여 실행 한 결과이다 : 분명히

Versi├│n de sistema 
5665727369fffffff36e2064652073697374656d61 
5665727369ffffffc3ffffffb36e2064652073697374656d61 

아니라 동일한 바이트 값의 모든 비교에있어서 실패가있는 2 개 스트링 같이 strncmp, STD : 문자열 ==을 std : sstring.comapre 등

어떻게해야합니까 s_area.m_s_area_text 문자열 감동에 대한 아이디어?

+0

코드에서 문자열을 비교하지 마십시오. – user463035818

+0

바이트를 비교하지 않는 비교 함수가 필요한 것처럼 보입니다. 이러한 함수를 작성하거나 두 문자열을 표준 표현으로 변환하여 바이트 비교 함수가 충분할 수 있습니다. 그것은 무시할 바이트에 따라 다릅니다. – nwp

+0

비교 함수를 건너 뛰었습니다 ... 모두 false를 반환합니다. 나는 모든 캐릭터를 skkiping하지 않고 전체 문자열을 비교해야합니다. –

답변

0

일반적으로 원시 바이트를 검사하여 문자열의 인코딩을 추측하는 것은 불가능합니다. 이 규칙의 예외는 바이트 순서 표시 (BOM)가 바이트 스트림의 시작 부분에있는 경우입니다. BOM은 바이트의 유니 코드 인코딩과 엔디안을 알려줍니다.

미래의 어떤 시점에서 정식 문자열 인코딩이 필요하다고 결정할 때 (의견에서 지적한대로 좋은 생각이 될 수 있음). C++에 대한 최선의 선택으로 UTF-8을 선호한다는 강력한 주장이 있습니다. 자세한 내용은 UTF-8 everywhere을 참조하십시오.

0

우선 두 가지 문자열을 올바르게 비교해보십시오. 적어도 인코딩을 알아야합니다. 귀하의 예에서는 s_area.m_s_area_text이 UTF-8로 인코딩 된 반면 s2은 ISO/IEC 8859-1 (라틴어 -1)이 사용되었습니다.

s_area.m_s_area_text이 항상 UTF-8로 인코딩된다는 확신이 있다면 s2에서 동일한 인코딩을 사용하고 비교해보십시오. UTF-8로 인코딩 된 문자열을 정의하는 한 가지 방법은 기본 문자 집합에없는 모든 문자를 \u으로 이스케이프 처리하는 것입니다.

std::string s2 = u8"Versi\u00F3n de sistema"; 
... 
if (s_area.m_s_area_text == s2) 
... 

또한 소스 파일에 대한 적절한 인코딩을 설정하고 컴파일러에 대한 인코딩을 지정하여 문자를 이스케이프하지 않고 그것을 할 수 있어야한다.

@nwp에서 언급했듯이 비교하기 전에 문자열을 정규화 할 수도 있습니다. 그렇지 않으면, 동일하게 보이는 두 개의 문자열이 서로 다른 유니 코드 표현을 가질 수 있으며 이는 비교 결과를 거짓 부정 결과로 만듭니다. 예를 들어, "Versión de sistema"는 "Versión de sistema"와 같지 않습니다.