【发布时间】:2018-10-19 20:06:10
【问题描述】:
上下文。
我正在将 C 写入 iCal (RFC 5545) 规范。它指定分隔行的最大长度为 75 个八位字节,不包括分隔符。稳健性原则和 W3C 字符模型都倾向于我将以 UTF8 编码的输入字符串规范化为 NFC 形式(请参阅Unicode Normalization Forms)。
在读取输入行时,我想读取静态分配的缓冲区。但是,即使 NFC 格式小于 75,一条线的 UTF8 表示也可能超过 75 个八位字节。所以这个缓冲区需要大于 75 个八位字节。我的问题是有多少。
问题。
NFC 格式最多为 75 个八位字节的 UTF8 字符串的最大八位字节长度是多少? (奖励积分:其 NFC 形式最多为 N 个八位字节。)
此外,这是保证和永久的,还是当前 Unicode 的未指定结果并可能发生变化?
【问题讨论】:
-
为什么不直接使用动态分配的缓冲区呢?执行 NFC 转换,如果结果大于您当前的缓冲区大小,则将缓冲区重新分配给更大的大小。
-
@RemyLebeau 是的,我可能会这样做。这个问题仍然是相关的,因为答案会在重新分配之前通知初始缓冲区“猜测”大小。
-
所需的大小实际上取决于在字符串中编码的特定代码点。单个代码点在 UTF-8 中编码为 1..4 个字节,因此 UTF-8 中的 75 个八位字节行最多可以包含 18..75 个代码点之间的任何位置,具体取决于特定内容。最好的情况是该行仅包含 ASCII 码点 U+0000..U+007F,然后每个码点 1 个八位字节(最多 75 个码点)。更糟糕的情况是,如果该行仅包含代码点 U+10000..U+10FFFF,则每个代码点 4 个八位字节(最多 18 个代码点)。
标签: utf-8 unicode-normalization canonicalization canonical-form