2

以下の例は Unicode 文字列で動作するはずですが、動作しません。


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.
4

2 に答える 2

4

via%@を含める場合に使用します。CFStringRefCFStringCreateWithFormat

『 Core Foundationの文字列プログラミングガイド』の「フォーマット指定子」セクションを参照してください。

  • %@Objective Cオブジェクト、ORCFTypeRefオブジェクト用です(CFStringRefと互換性がありますCFTypeRef
  • %s8ビットの符号なし文字(つまり、通常のC文字列)のヌル終了配列用です。
  • %S16ビットUnicode文字のヌル終了配列用です。

CFStringRefオブジェクトは、「16ビットUnicode文字のnullで終了する配列」と同じではありません。

于 2010-01-08T14:08:50.877 に答える
2

他の回答のコメントへの回答として、ポスターをお勧めします

  • 移植可能な方法でUTF8文字列を生成しますchar*
  • そして、最後に、エンコーディングとしてwithをCFString使用するように変換します。CFStringCreateWithCStringkCFStringEncodingUTF8

%sでは使用しないでくださいCFStringCreateWithFormat。「システム エンコーディング」に依存しないでください。これは、西ヨーロッパ環境では MacRoman ですが、他の言語ではそうではありません。システム エンコーディングの概念は、特に ASCII コード範囲 (127 未満!) 内の文字でさえ変更される東アジア環境 (私が出身) では、本質的に脳死状態です。「システムエンコーディング」に頼ると、地獄が解き放たれます。幸いなことに、10.4 以降、「システム エンコーディング」を使用するすべてのメソッドは非推奨になりまし %sた。

この小さなトピックにこれだけ書いて申し訳ありませんが、数年前、この「システムエンコーディング」のために日本語/韓国語の Mac で動作しない素晴らしいアプリがたくさんあったのは本当に残念でした。興味のある方は数年前に書いたこちらの詳しい説明を参照してください。

于 2010-01-09T01:53:58.623 に答える