CFStringTokenizerを使用してテキストを単語に分解していますが、CFStringが使用しているエンコーディングとUTF8をブリッジするのは難しいです。非ASCII文字が遭遇した場合はC文字列から読み取るしようとしたときUTF8 C文字列のCFStringTokenizerのトークン範囲
NSString *theString = @"Lorem ipsum dolor sit amet!";
const char *theCString = [theString cStringUsingEncoding:NSUTF8StringEncoding];
tokenizer = CFStringTokenizerCreate(kCFAllocatorDefault,
(__bridge CFStringRef)theString,
CFRangeMake(0, [theString length]),
kCFStringTokenizerUnitWordBoundary,
locale);
while ((tokenType = CFStringTokenizerAdvanceToNextToken(tokenizer)) != kCFStringTokenizerTokenNone) {
tokenRange = CFStringTokenizerGetCurrentTokenRange(tokenizer);
memcpy(resultPtr, theCString+tokenRange.location, tokenRange.length);
}
残念ながらトークナイザによって報告された範囲が正しくありません。このことを考えてみましょう。どのように私のCの文字列から正しい文字をプルできるようにトークナイザから正しい範囲を取得することができますか?
明確にするために、memcpyのものは上記よりも複雑で、ターゲットデバイスであるiPhoneのパフォーマンスに必要です。だから、私はCFStringサブストリングを作成してそれを変換するようなことさえできません。私はC文字列の範囲を必要とします。さまざまな単語境界ライブラリを再実装せずに、それを行うための方法はありますか? (これは、できるだけ多くあるので、私はただ、残念ながら「」を探してを繰り返し処理することはできません。)
アレック
UTF-16ではなく、UTF-8で
ありがとうございましたピーター、私は今getBytesを使用して、範囲の問題を並べ替えました。私はそれがiPhone上で多くのオーバーヘッドを追加するような方法を避けたかったが、今はこのアルゴリズムでは時間の約60%を費やしており、残りの作業はまったく些細なことではありません。残念ながらgetBytesの「NoCopy」バリアント(私が知っているのですか?)はありませんので、私は最適化に関して道路の終わりに達していると思います。 – Max
@Alec:別の質問それはあなたがUTF-8データを使って何をしようとしているのかを示しています。 –