可区分的字符?
我在数据库里有一堆物品,每个物品都有一个独特的ID。我想把这个ID缩短一下,然后在页面上显示出来,这样如果用户需要打电话联系我们关于某个特定的物品时,他可以告诉我们这个缩短的ID,而不是一个很长的数字。就像一些网站上的SKU一样,比如NCIX。所以,我在考虑用36进制来编码这个ID。不过,这样做有个问题,就是像1lI
这些字符看起来都差不多。我在想要不要把这些看起来相似的字符去掉。这样做是个好主意吗,还是说我应该用一种更容易辨认的字体呢?
4 个回答
1
使用易读的字体。
6
没错,你应该消除那些让人困惑的地方。因为如果有可能出错,肯定会有人犯错。比如,数字0和字母O,字母I和小写字母l或数字1,很容易搞混,所以最好不要同时使用它们。其实这很简单——只要不使用这三个字符(i、L和o),你就可以用36进制减去3,得到33,然后进行转换。
SKU.replace('I','X').replace('L','Y').replace('O','Z')
反过来说,当你拿到这样的代码,并准备执行int(SKU, 33)之前,你需要把XYZ这些字符换回那些让人困惑的字符。不过在这之前,如果你意外地得到了L或I,就把它们替换成1;如果得到了O,就把它替换成0。例如,可以使用SKU.translate(),配合
string.maketrans('LIOXYZ','110IL0')
来实现。