Utf 8 给定长度的NFC格式字符串的最长UTF8表示形式是什么?

Utf 8 给定长度的NFC格式字符串的最长UTF8表示形式是什么?,utf-8,unicode-normalization,canonicalization,canonical-form,Utf 8,Unicode Normalization,Canonicalization,Canonical Form,上下文。 我正在将C写入iCal(RFC5545)规范。它将分隔线的最大长度指定为75个八位字节(不包括分隔符)。健壮性原则和W3C字符模型都倾向于将UTF8编码的输入字符串规范化为NFC格式(请参阅) 在读取输入行时,我希望读入静态分配的缓冲区。但是一条线的UTF8表示可能超过75个八位字节,即使它的NFC形式小于75。所以这个缓冲区需要大于75个八位字节。我的问题是有多少 问题。 NFC形式最多为75个八位字节的UTF8字符串的最大八位字节长度是多少?(加分:其NFC形式最多为N个八位字节。

上下文。

我正在将C写入iCal(RFC5545)规范。它将分隔线的最大长度指定为75个八位字节(不包括分隔符)。健壮性原则和W3C字符模型都倾向于将UTF8编码的输入字符串规范化为NFC格式(请参阅)

在读取输入行时,我希望读入静态分配的缓冲区。但是一条线的UTF8表示可能超过75个八位字节,即使它的NFC形式小于75。所以这个缓冲区需要大于75个八位字节。我的问题是有多少

问题。

NFC形式最多为75个八位字节的UTF8字符串的最大八位字节长度是多少?(加分:其NFC形式最多为N个八位字节。)


此外,这是有保证的、永久的还是当前Unicode的未指定结果,可能会发生变化?

下面是一些Javascript代码,它们试图找到Unicode代码点,在转换为NFD并返回NFC时,其UTF-8表示收缩最大。似乎没有任何代码点收缩超过三倍。据我所知,Unicode规范化算法只需通过这种方式检查单个代码点

我认为,至少在理论上,这可能会在未来的Unicode版本中发生变化。但是,当规范化为NFC时,字符串的扩展是有问题的(另请参见),所以我认为这很可能永远不会改变:

规范映射(分解映射属性值)总是受到限制,因此当规范化为NFC时,没有字符串扩展到超过3×长度(以代码单位度量)

因此,分配一个比最大行长度大三倍的初始缓冲区似乎是一个合理的选择

var最大比率=2;
var代码点=[];
对于(变量i=0;i=0xD800&&i最大比率){
最大比率=比率;
码点=[i];
}
else if(比率==最大比率){
码点推送(i);
}
}
log(`Max ratio:${maxRatio}`);
用于(代码点的代码点){
//排除韩语音节

如果(codePoint>=0xAC00&&codePoint为什么不直接使用动态分配的缓冲区呢?执行NFC转换,如果结果大于当前缓冲区大小,则将缓冲区重新分配到更大的大小。@RemyLebeau是的,我可能会这样做。问题仍然相关,因为答案将通知初始缓冲区”“猜猜看"重新分配前的大小。所需的大小实际上取决于字符串中编码的特定代码点。单个代码点在UTF-8中的1..4字节之间编码,因此UTF-8中的75个八位组行可以包含最大18..75个代码点之间的任何位置,具体取决于特定内容。最好的情况是,该行仅包含ASCII码点U+0000..U+007F,则每个码点1个八位字节(最多75个码点)。更糟糕的情况是,如果该行仅由码点U+10000..U+10FFFF组成,则每个码点4个八位字节(最多18个码点)。