gpt4 book ai didi

cocoa - 当二进制数据解码为 UTF-8 时会发生什么?

转载 作者:行者123 更新时间:2023-12-03 16:27:04 25 4
gpt4 key购买 nike

我有一个包含混合二进制和 UTF-8 编码数据的文件。

看起来像

-----------------
| Binary data |
| (unknown len) |
+---------------+
| Delimiter |
+---------------+
| UTF-8 string | <--- only relevant part of file
+---------------+
| Delimiter |
+---------------+
| Binary data |
-----------------

我正在尝试提取文本,并且不关心二进制内容。我将文件读入字符串,将所有内容解码为 UTF-8,然后使用 NSScanner 查找分隔符。

我担心的是,根据二进制数据的内容,将其解码为 UTF-8 可能会导致某种偏移问题,从而导致无法找到分隔符。 (假设分隔符之前的数据使下一个序列解析为多个字节,并且它会丢失。)

此代码在处理某些内容时是否会出现问题?

NSString *fileContents = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:NULL];
NSScanner *scanner = [NSScanner scannerWithString:fileContents]
[scanner scanUpToString@"<DELIMITER>" intoString:nil];
// TODO: remove delimiter
NSString *desiredString;
[scanner scanUpToString:@"<DELIMITER2>" intoString:&desiredString];

最佳答案

UTF-8 多字节序列仅由 0x80–0xFF 范围内的字节组成,因此,假设您的分隔符字面意思如所示( <DELIMITER><DELIMITER2> ),它们完全由不能组成的字符组成多字节序列的。 (任何纯 ASCII 字符串都具有此属性。)

但是,UTF-8 序列也带有长度标记。例如,如果您有三字节序列

E2 80 3C

E2 表示它是 3 字节序列的第一个字节,但 3C 不能是该序列的一部分。 UTF-8 解码器应该要么抛出错误,要么生成两个码点序列 U+FFFD U+003C,但我不会对解码器吃掉 3C 并只生成一个感到惊讶替换字符。

因此,您提出的建议并不安全,您应该(正如 oh71zb 建议的那样)以二进制形式读取文件,扫描分隔符,提取它们之间的内容,然后才将这些字节解释为 UTF-8。

关于cocoa - 当二进制数据解码为 UTF-8 时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17285015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com