0

我正在研究处理UTF-8编码的东西,我发现自己在问这个问题:

  • 当我遇到一个从未在 UTF-8编码字符串中出现的字节时,我该怎么办?

IE0x1111111X

例如,我正在编写一小段代码,它查看字节流中的当前位置,并告诉您使用多少字节来表示流中该位置的代码点。

  • 0x0XXXXXXX只有 1
  • 0x10XXXXXX哎呀,我们在一个连续字节中,向后搜索以找到前导字节
  • 0x11XXXXXX计算前导 1 的数量,这就是答案
  • 0x1111111X错误,这是不可能的UTF-8!该怎么办!?!?

我正在考虑返回一个错误值,但想知道是否应该将其替换为一些更可预测的错误字形(我的意思是表示所述字形的代码点)。后来当我做一些更复杂的事情时,比如跳过字符串并发现前导字节后面没有正确数量的连续字节......我想我也应该“修复”它。

将错误编码的字符串破坏,或者更改它们并使其错误但至少玩得好,这是标准做法吗?

4

1 回答 1

0

最常见的方法是在输入不正确时抛出一个有意义的错误并停止。

这样做有很多充分的理由:

  • 速度:如果您尝试修复错误,这通常会导致您的功能变慢,即使输入正确也是如此
  • 简单:如果您尝试修复任何错误,您的代码可能会变得非常复杂
  • 可维护性和正确性:只要输入与您正在使用的规范不匹配,当您停止时,更容易确保函数正常工作。因为您只需根据规范检查输入。
  • 目的:任何时候你到了像这里这样的地步,你必须想一想:我的功能的目的是什么?为什么我想出了写它的想法?

    另外:修复 uft8 的函数fixcode也可以在其他地方使用,因此将修复分开是完全有意义的(目的、简单性、可维护性和正确性参数)。

    即使您预计会出现错误,我也更愿意将编码和修复代码分开,因为您可以在外部上下文中重用修复代码。

如果您真的在考虑在编码时修复 utf8 代码,我会使用这样的模式:

try {
  q = encode(s);
} catch(encodingerror) {
  log(encodingerror);
  t = fixcode(s);
  q = encode(t);
}
于 2013-02-15T09:37:53.627 回答