2

UTF7 デコードに問題があります。次のサンプル コードを作成して、問題を切り分けることができました。

NSStringEncoding stringEncoding = myFunctionForTranslateCodepageToEncoding(codePage);
// see the end of the string, it's important
const char * testBuffer ="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa+ADw-";

NSString * testString = [[NSString alloc] initWithBytes:testBuffer length:strlen(testBuffer) encoding:stringEncoding];

どこ:

strlen(testBuffer) は 508、

「codePage」は 65000 です。

'stringEncoding' は 2214592768 です (予想どおり、おそらく UTF-7 ですが、明確な確認が見つかりません…)。

'+ADw-' は '<' の UTF7 シーケンスです。

この例では、testString は常に nil であるため、変換は失敗します。しかし、ここに奇妙なことがあります:

  1. testBuffer から「a」を 1 つだけ削除すると、変換が機能し、testString が適切に作成されます。'a' を 1 つ以上追加すると、機能しません。
  2. 最後に utf7 でエンコードされたシンボル (この例では「+ADw-」のみ) を「損傷」すると、正常に動作します。「.ADw-」または「+ADw」に変更できます。バッファは適切に変換されます。もちろん、「破損した」シンボルはデコードされず、文字どおりに書かれているだけですが、変換は機能します。NSString に「…aaaaa.ADw-」を生成します。バッファを 1 カットすることもできるので、「…aaaaa+ADw」としますが、これも適切に変換されます (UTF7 シンボルが不完全であるため)。
  3. UTF7 シンボルの後に、バッファの最後に ASCII 文字を追加すると、機能します。つまり、"…aaaaa+Adw-a" は NSString "…aaa>a" に変換されます。
  4. バッファーに含まれる UTF7 シンボルが増えると、失敗し始める長さが変わります。したがって、常に 508 文字以上であるとは限りません。
  5. 最後に他の UTF7 記号を使用できます。それは問題ではありません。

また、initWithBytes: メソッドを initWithCString に置き換えようとしました。考えられるすべてのケースをチェックしたわけではありませんが、テストしたすべてのケースで initWithBytes: と同じように動作します。iOS 6.0 でテストを実行しました。

UTF7 でエンコードされた文字列を適切に処理する方法はありますか?

4

0 に答える 0