Utf 8 Unicode-正确的做法

Utf 8 Unicode-正确的做法,utf-8,Utf 8,我正在研究处理UTF-8编码的东西,我发现自己在问这样一个问题: 当我遇到一个从未出现在内存中的字节时,我该怎么办 UTF-8编码字符串 i、 e.0x1111111X 例如,我正在编写一小段代码,它查看字节流中的当前位置,并告诉您有多少字节用于表示流中该位置的代码点 0x0XXXXXXX1 0x10XXXXXXoops,我们在一个延续字节中, 向上搜索以查找前导字节 0x11XXXXXX 前导1的数量,这就是答案 0x1111111Xerr,这不是 在UTF-8中可能!!!怎么办 我正

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

  • 当我遇到一个从未出现在内存中的字节时,我该怎么办
    UTF-8
    编码字符串
i、 e.
0x1111111X

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

  • 0x0XXXXXXX
    1
  • 0x10XXXXXX
    oops,我们在一个延续字节中, 向上搜索以查找前导字节
  • 0x11XXXXXX
    前导1的数量,这就是答案
  • 0x1111111X
    err,这不是 在
    UTF-8中可能!!!怎么办
    
我正在考虑返回一个错误值,但不知道是否应该用一些更可预测的错误标志符号(我指的是表示所述标志符号的代码点)替换它,作为副作用。后来我做了一些更复杂的事情,比如跳过字符串,发现前导字节后面没有正确的连续字节数。。。我想我也应该“修复”它


标准做法是将错误编码的字符串保留为断开状态,还是对其进行更改,使其出错,但至少要表现良好?

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

有很多很好的理由这样做:

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

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

    即使您预期会出现错误,我还是希望将encode和fixcode分开,因为 您可以在外部上下文中重用修复代码

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

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

我想到了浏览器。如果设置了编码utf-8并使用非utf-8字符,则它们看起来像菱形中的问号。所以我认为你可以改变错误的字符。但是如果您发送或存储这些数据,那么显然您必须存储原始数据的副本。@qben是的,我确实考虑过这一点,但请看,这可能只是显示代码或一些底层处理库。我想我的问题是关于lib的,我不希望提到这个异常模式,它似乎是异常的一个糟糕用法,我可以想出一些简单的方法来实现。但也有一些优点,特别是关于重用/维护责任的分离。