1

CFString があり、Python で使用したいと考えています。

そうするための最速の方法は何ですか?変換を回避すること、つまり CFString ポインターから Python 文字列を作成することはできますか?

4

2 に答える 2

1

変換を回避すること、つまり CFString ポインターから Python 文字列を作成することはできますか?

私が知っていることではありません。Python はクロスプラットフォームになるように作成されており、CFStrings が利用可能であっても内部的に使用する理由はまったくありません。

文字列のバッキングC stringMacRoman Pascal string、またはUTF-16 文字 bufferを取得できる場合がありますが、これらはすべて失敗することが許可されているため、それらのいずれかが機能することに依存することはできません。最後の試行として、文字を独自のバッファーにコピーすることを常に実装する必要があります。

MacRoman から UTF-8 に変換する必要があるため、おそらく Pascal 文字列ルートを試す必要さえありません。その時点で、文字列独自の変換 API を使用することもできます。

[変換] するための最速の方法は何ですか?

上記のショートカットのいずれか (パスカル文字列を除く) が成功した場合、それが最速の方法になります。

いずれにせよ、何らかの形で文字を含むバッファーを取得し、そのバッファーから Python 文字列を作成する必要があります。

この時点で、Python 2.x ではstr型が純粋な 8 ビット データ オブジェクトであることに注意してください。このため、Python 3 では名前が に変更されましたbytes。NS/CFString ではなく、NS/CFData に対応する Python と見なす必要があります。

NS/CFStrings には Unicode 文字が含まれているため、 Python unicode( strPython 3) の typeが必要です。

注意CFStringGetLength: UTF-16 コード単位で長さを返します。UTF-8 を使用することになった場合、UTF-8 コード単位の長さが異なる場合があります。

その Python ドキュメントから、CFString から取得できるものに応じて、Python 文字列を作成する方法を次に示します。

TL;DR

Python のunicode(PyUnicode) クラスのみを使用します。str/ bytes/ PyString/ではありませんPyBytes

GetCStringPtr最初に (UTF-8 を要求して)試してみます。成功した場合は、 を呼び出してその文字列の長さをCFStringGetMaximumSizeForEncoding(願わくば よりも早く) 判断し、 を呼び出して Python 文字列を作成します。strlenPyUnicode_FromStringAndSize

次に、CFStringに変換する最速のエンコーディングを尋ねます。

  • 最速のエンコーディングが UTF-16 (または、CFString がそれを「Unicode」と呼んでいる) である場合、私はCFStringGetLength, CFStringGetCharactersPtr, CFStringGetCharacters(GetCharactersPtr失敗した場合) と. を使用しPyUnicode_FromUnicodeます。
  • それ以外の場合はCFStringGetBytes関数を 1 回使用して UTF-8 への変換に必要なバッファー サイズを決定し、もう一度その変換を実行してからPyUnicode_FromStringAndSize.

(「if」は時期尚早の最適化である可能性があることを指摘しておく必要があります。CFStringGetBytesこれは、CFString の中心的なテキスト エンコーディング変換関数です。UTF-16 を含む任意のCFStringGetCharacters{Ptr,}エンコーディングを返すことができます。条件付きソリューションと無条件ソリューションの両方を記述したい場合があります。CFStringGetBytesまた、現在処理している文字列のエンコーディングが実際に UTF-16 であるかどうかを確認することもできます。)

于 2012-05-05T02:12:23.327 に答える
-2

なぜPythonでCFStringを使いたいのですか..ところで、CF文字列には独自の構造が定義されており、メモリに格納される方法はPython文字列とは異なります。この変換を行うことはできません。

于 2012-05-03T11:45:52.707 に答える