我对 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,因此转换失败。但这里有一些奇怪的事情:
- 当我从 testBuffer 中删除一个“a”时,转换工作,testString 被正确创建。当我添加一个或多个“a”时,它不起作用。
- 当我“损坏”结尾的 utf7 编码符号(本例中唯一的一个,“+ADw-”)时,它可以正常工作。我可以将其更改为“.ADw-”或“+ADw”。并且缓冲区被正确转换。当然,“损坏”符号没有被解码,它只是按字面书写,但转换有效。它在 NSString 中生成“…aaaaa.ADw-”。我也可以将缓冲区减 1,所以我会得到“…aaaaa+ADw”,它也会被正确转换(因为 UTF7 符号不完整)。
- 当我在缓冲区末尾添加任何 ASCII 字符时,在 UTF7 符号之后,它可以工作。所以 Ie "...aaaaa+Adw-a" 被转换成 NSString "...aaa>a"。
- 当缓冲区包含更多 UTF7 符号时,它开始失败时的长度会发生变化。所以它并不总是 508 个或更多字符。
- 我可以在最后使用任何其他 UTF7 符号。没关系。
我也尝试用 initWithCString 替换 initWithBytes: 方法。我没有检查所有可能的情况,但在所有测试的情况下,它的行为与 initWithBytes: 相同。我已经在 iOS 6.0 上进行了测试。
您对如何正确处理 UTF7 编码的字符串有任何想法吗?