null과 같은 모든 종류의 제어 문자가있는 이상한 입력 파일이 있습니다. 이 Windows-1252로 인코딩 된 텍스트 파일에서 모든 제어 문자를 제거하고 싶지만 이렇게하면 :
std::string test="tést";
for (int i=0;i<test.length();i++)
{
if (test[i]<32) test[i]=32; // change all control characters into spaces
}
é도 공백으로 변경됩니다.
따라서 Windows-1252로 인코딩 된 다음과 같은 문자열이있는 경우 :
std::string test="tést";
16 진수 값은 다음과 같습니다.
t é s t
74 E9 73 74
참조 https://en.wikipedia.org/wiki/ASCII 및 https://en.wikipedia.org/wiki/Windows-1252
test [0]은 십진수 116 (= 0x74)과 같지만 é / 0xE9를 사용하면 test [1]은 십진수 값 233과 같지 않습니다.
그렇다면 어떻게 그것을 올바르게 인식 할 수 있습니까?
32
는 부호있는 정수이며, 부호있는 정수와 비교하는 char
것은 부호있는 것처럼 컴파일러에 의해 수행됩니다. E9 (-23) <32 true를 반환합니다.
부호의 리터럴 사용 32
하고, 32u
비교하게하는 부호 값에서 수행 될 : E9 (233) <32 false를 반환한다.
바꾸기 :
if (test[i]<32) test[i]=32;
으로:
if (test[i]<32u) test[i]=32u;
그리고 예상 된 결과를 얻어야합니다.
여기에서 테스트하십시오 : https://onlinegdb.com/BJ8tj0kbd
참고 : char
다음 코드로 서명 되었는지 확인할 수 있습니다 .
#include <limits>
...
std::cout << std::numeric_limits<char>::is_signed << std::endl;
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다