Unicode - 正确的做法

时间:2013-02-15 09:02:58

标签: utf-8

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

  • 遇到一个永远不会出现在字母内的字节时,我该怎么办? UTF-8编码的字符串?

即。 0x1111111X

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

  • 0x0XXXXXXX只是1
  • 0x10XXXXXX oops,我们在一个连续字节中, 搜索上游以查找前导字节
  • 0x11XXXXXX算上了 领先1的数量,这就是答案
  • 0x1111111X错误,这不是 可能在UTF-8 !!!怎么办!?!?

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

标准做法是将错误编码的字符串断开,或者更改它们并使它们出错但至少要好看吗?

1 个答案:

答案 0 :(得分:0)

最常见的方法是,如果输入不正确,则抛出有意义的错误并停止。

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

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

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

    即使您预计会出现错误,我也希望将编码和修补代码分开 您可以在外部环境中重复使用修补代码

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

try {
  q = encode(s);
} catch(encodingerror) {
  log(encodingerror);
  t = fixcode(s);
  q = encode(t);
}