cfstringcreatewithformat은 어떤 종류의 문자열이 인수로 기대합니까?
문제
아래 예제는 유니 코드 문자열에서 작동해야하지만 그렇지 않습니다.
CFStringRef aString = CFSTR("one"); // in real life this is an Unicode string
CFStringRef formatString = CFSTR("This is %s example"); // also tried %S but without success
CFStringRef resultString = CFStringCreateWithFormat(NULL, NULL, formatString, aString);
// Here I should have a valid sentence in resultString but the current result is like aString would contain garbage.
해결책
사용 %@
포함하려면 a CFStringRef
~을 통해 CFStringCreateWithFormat
.
보다 Core Foundation 용 문자열 프로그래밍 안내서 형식 지정자 섹션.
%@
객관적인 C 객체를위한 것입니다CFTypeRef
사물 (CFStringRef
호환됩니다CFTypeRef
)%s
8 비트 부호없는 문자의 무효가 종결 된 배열 (예 : 정상 C 문자열) 용입니다.%S
16 비트 유니 코드 문자의 널리 터진 배열입니다.
CFStringRef 객체는 "16 비트 유니 코드 문자의 널리 터진 배열"과 동일하지 않습니다.
다른 팁
다른 답변의 의견에 대한 답변으로, 나는 포스터를 추천합니다.
- 휴대용 방식으로 UTF8 문자열을 생성하십시오
char*
- 그리고 마지막 순간에
CFString
사용CFStringCreateWithCString
~와 함께kCFStringEncodingUTF8
인코딩으로.
제발, 제발 사용하지 마십시오 %s
안에 CFStringCreateWithFormat
. 서유럽 환경에서는 마크로노 인 "시스템 인코딩"에 의존하지 않지만 다른 언어는 아닙니다. 시스템 인코딩의 개념은 본질적으로 ASCII 코드 범위 (127 미만) 내부의 문자조차 수정되는 동아시아 환경 (내가 온 동아시아 환경)에서 본질적으로 두뇌 깊이입니다. "시스템 인코딩"에 의존하면 지옥이 느슨해집니다. 다행히도 10.4 이후 "시스템 인코딩"을 사용하는 모든 방법은 이제 더 이상 사용되지 않습니다. 제외하고 %s
... .
이 작은 주제에 대해 이것을 많이 써서 죄송합니다. 그러나 몇 년 전에이 "시스템 인코딩"으로 인해 일본/한국 Mac에서 작동하지 않은 멋진 앱이 많이 있었을 때 정말 유감이었습니다. 참조하십시오 이 자세한 설명 내가 몇 년 전에 쓴 것은 관심이 있다면.
제휴하지 않습니다 StackOverflow