是否有标准算法将 guid 编码为 base 107 或更大?

Is there a standard algorithm to encode a guid as base 107 or greater?

我需要将 guid 转换为 19 个或更少的字符,这些字符可以转换回完全相同的 guid。

我能找到的最接近的编码实际上有正式的文档并且看起来像我需要的是 this base 85 编码。它使用前 128 个字符 ASCII 集中的 "safe" 个字符中的 85 个,并将任何 guid 带到 20 个字符,这是不使用扩展 ascii 范围所能获得的最佳字符。

话虽这么说;我需要知道是否有正式编码,对于某些扩展的 ASCII 集,它是 base 107 或更多,因为这是将任何 guid 放入 19 个字符所需的最少符号数。

(x19-1) ≥ (1632-1) :x 必须大于 107

注意:我可以很容易地想出我自己的转换,但我想知道是否有一个标准化的算法可以解决这个问题。

快速网络搜索没有找到任何有用的编码标准。即使有,您对字符易于人类区分的额外要求也可能很难满足。有很多字符,即使在标准集中,看起来相似或可能引起混淆,例如单引号和双引号、不同宽度的破折号,或许多不同的变音符号,如 ó、ò、ô、õ、ö 和 ø。

这 140 个字体在以精心挑选的大字体显示时可能没有问题:

0 1 2 3 4 5 6 7 8 9
a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
! " # $ % & ( ) * + , - . / : ; < = > ? @ [ \ ] ^ { | } ~
€ ‡ ‰ • ™ ¢ £ ¤ ¥ § © ¬ ® ¯ ° ± ² ³ ¶ ¹ ¼ ½ ¾ ¿ ÷
Š Œ Ž š œ ž µ Æ Ç Ð Ñ æ ç ñ Ÿ Ã Ê Õ Û ÿ ã ê õ û

如果您必须删除可能导致技术问题的字符,例如当显示为 html 的一部分或输入网络表单时,将是:

" % & < > \

如果您想删除 phone 中难以描述或令人困惑的字符,例如:

‡ ‰ ¤ ¬ ¯ µ ¶ ÷ Ð Œ Æ æ œ

如果您想删除某些(小)字体中可能难以识别或区分的字符,例如:

• ™ ® ³ ¹ ¼ ¾ Ç ç |

普通文本也会遇到一些问题,例如:

l versus I
O versus 0

因此,一组安全的最容易区分的字符可能是例如:

  1 2 3 4 5 6 7 8 9                                  (no zero)
a b c d e f g h i j k   m n o p q r s t u v w x y z  (no 'l')
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
! # $ ( ) * + , - . / : ; = ? @ [ ] ^ { } ~
€ ¢ £ ¥ § © ° ± ² µ ½ ¿
ã Ã ê Ê ñ Ñ õ Õ š Š û Û ÿ Ÿ ž Ž

本集只剩下110个字了,如果觉得小字体看不清楚,或者太像,或者难以描述记不住,还可以删除一两个,但是如您所见,实际上并没有那么多选择。


我必须补充一点,识别字符可能与文化有关。我希望法国人很容易看出 é、è 和 ê 之间的区别,而对于说英语的人来说,这三者可能看起来都像 "an e with an accent on top"。这也是为什么我 select 任何版本的 'i' 都没有变音符号的原因;如果您不期待 'i' 的不同版本,因为您的语言不使用它们,则很容易将变音符号与标准的点缀 'i' 混淆。


另请注意 "Latin-1" 字符集有不同版本:原始 ISO 8859-1 from 1987, the ISO 8859-15 update from 1999 which added e.g. the Euro sign, and Windows-1252(也称为 ISO-8859-1)现在用作 [=40] 时的默认值=] 在 HTML5 文档中指定,我在上面的示例中使用了它。