문제

아래 예제는 유니 코드 문자열에서 작동해야하지만 그렇지 않습니다.


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에서 작동하지 않은 멋진 앱이 많이 있었을 때 정말 유감이었습니다. 참조하십시오 이 자세한 설명 내가 몇 년 전에 쓴 것은 관심이 있다면.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top