CFString があり、Python で使用したいと考えています。
そうするための最速の方法は何ですか?変換を回避すること、つまり CFString ポインターから Python 文字列を作成することはできますか?
CFString があり、Python で使用したいと考えています。
そうするための最速の方法は何ですか?変換を回避すること、つまり CFString ポインターから Python 文字列を作成することはできますか?
変換を回避すること、つまり CFString ポインターから Python 文字列を作成することはできますか?
私が知っていることではありません。Python はクロスプラットフォームになるように作成されており、CFStrings が利用可能であっても内部的に使用する理由はまったくありません。
文字列のバッキングC string、MacRoman 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
( str
Python 3) の typeが必要です。
注意CFStringGetLength
: UTF-16 コード単位で長さを返します。UTF-8 を使用することになった場合、UTF-8 コード単位の長さが異なる場合があります。
その Python ドキュメントから、CFString から取得できるものに応じて、Python 文字列を作成する方法を次に示します。
PyUnicode_FromString
関数は、UTF-8 でエンコードされた C 文字列を受け取ります。PyUnicode_FromStringAndSize
関数は、UTF-8 でエンコードされた文字のバッファーと、そのバッファーのサイズを受け取ります。これはおそらく よりも高速ですFromString
。PyUnicode_FromUnicode
関数は、UTF-16 でエンコードされた文字のバッファーと、そのバッファーのサイズを受け取ります。Python のunicode
(PyUnicode) クラスのみを使用します。str
/ bytes
/ PyString
/ではありませんPyBytes
。
GetCStringPtr
最初に (UTF-8 を要求して)試してみます。成功した場合は、 を呼び出してその文字列の長さをCFStringGetMaximumSizeForEncoding
(願わくば よりも早く) 判断し、 を呼び出して Python 文字列を作成します。strlen
PyUnicode_FromStringAndSize
次に、CFStringに変換する最速のエンコーディングを尋ねます。
CFStringGetLength
, CFStringGetCharactersPtr
, CFStringGetCharacters
(GetCharactersPtr
失敗した場合) と. を使用しPyUnicode_FromUnicode
ます。CFStringGetBytes
関数を 1 回使用して UTF-8 への変換に必要なバッファー サイズを決定し、もう一度その変換を実行してからPyUnicode_FromStringAndSize
.(「if」は時期尚早の最適化である可能性があることを指摘しておく必要があります。CFStringGetBytes
これは、CFString の中心的なテキスト エンコーディング変換関数です。UTF-16 を含む任意のCFStringGetCharacters{Ptr,}
エンコーディングを返すことができます。条件付きソリューションと無条件ソリューションの両方を記述したい場合があります。CFStringGetBytes
また、現在処理している文字列のエンコーディングが実際に UTF-16 であるかどうかを確認することもできます。)
なぜPythonでCFStringを使いたいのですか..ところで、CF文字列には独自の構造が定義されており、メモリに格納される方法はPython文字列とは異なります。この変換を行うことはできません。