nsstream, utf8string & nsstring… 지저분한 변환
문제
NSStream을 통해 서버로 전송할 데이터 패킷을 구성하고 있습니다. A '§'(ASCII 코드 167)로 두 개의 데이터를 분리하려고합니다. 이것이 서버가 구축되는 방식이므로 그 경계 내에 머무르려고 노력해야합니다 ...
unichar asciiChar = 167; //yields @"§"
[self setSepString:[NSString stringWithCharacters:&asciiChar length:1]];
sendData=[NSString stringWithFormat:@"USER User%@Pass", sepString];
NSLog(sendData);
const uint8_t *rawString=(const uint8_t *)[sendData UTF8String];
[oStream write:rawString maxLength:[sendData length]];
따라서 최종 결과는 다음과 같아야합니다. 그리고 SendData가 처음 구성 될 때.
USER User§Pass
그러나 서버 측에서 수신되면 다음과 같습니다.
//not a direct copy and paste. The 'mystery character' may not be exact
USER UserˤPas
... Seperator 문자열의 길이가 2 개가되었고 마지막 문자는 명령에서 자랐습니다. 나는 이것이 UTF8 변환에 의해 원인이라고 생각합니다.
누구든지 나를 위해 이것에 대해 약간의 빛을 발할 수 있습니까?
모든 도움이 크게 감사하겠습니다!
해결책
이 문자의 UTF-8에서 올바른 인코딩은 2 바이트 시퀀스 0xc2 0xa7입니다. 이것이 당신이 얻는 것입니다. (fileformat.info 이것은이 물건에 귀중합니다.) 이것은 라틴 -1 세트에서 벗어 났으므로 단일 바이트 167 인코딩을 얻기 위해 nsutf8stringencoding 대신 nsisolatin1stringencoding을 사용하고 싶어합니다. 보다 NSString -dataUsingEncoding:
.
다른 팁
당신이 가진 것과 당신이 전송하고 싶은 것은 실제로 UTF-8 현이 아니며, 기술적으로 미국-ASCII가 아닙니다. 왜냐하면 그것은 7 비트에 불과하기 때문입니다. 작업하는 프로토콜에 따라 임의의 바이트 배열을 전송하려고합니다. 바이트 배열, 사용자 이름 및 비밀번호의 두 필드는 자체가 UTF-8 문자열 일 수 있지만 167
분리기 UTF-8 문자열이 될 수 없습니다.
다음은 다음과 같습니다.
- 구성
uint8_t*
적어도 두 가지 다른 것을 사용하는 바이트 배열NSString
객체 플러스167
암호. 사용자 이름이나 암호에 ASCII가 아닌 문자가 포함될 수있는 경우에 필요합니다. - 사용
NSString
방법getBytes:maxLength:usedLength:encoding:options:range:remainingRange
그리고 설정encoding
에게NSASCIIStringEncoding
. 이렇게하면 사용자 이름과 비밀번호가 US-ASCII 전용임을 다른 곳에서 검증해야합니다. - 사용
NSString
방법getCString
. 그러나 원하는 인코딩을 지정할 수 없기 때문에 더 이상 사용되지 않았습니다.