【问题标题】:Encode to alphanumeric in JavaScript在 JavaScript 中编码为字母数字
【发布时间】:2015-11-09 07:56:25
【问题描述】:

如果我有一个随机字符串并想将其编码为另一个仅包含字母数字字符的字符串,那么在 JavaScript / NodeJS 中最有效的方法是什么?

显然必须可以在需要时将输出字符串转换回原始输入字符串。

谢谢!

【问题讨论】:

  • 您的输入字符串会是什么样子?还有only contains alphanumeric characters是什么意思?您的输入字符串是否包含非字母数字字符?
  • 可以,输入字符串可以包含任意字符,输出字符串只能包含字母数字字符。
  • 字符串转换的目的是什么?

标签: javascript node.js string encoding urlencode


【解决方案1】:

要编码为字母数字字符串,您应该使用字母数字编码。一些流行的包括十六进制 (base16)、base32、base36、base58 和 base62。使用十六进制的替代方法是因为较大的字母会导致较短的编码字符串。以下是一些信息:

  • 十六进制很受欢迎,因为它很常见。
  • Base32 和 Base36 对于不区分大小写的编码很有用。 Base32 更易于阅读,因为它删除了一些容易误读的字母。 Base32 用于游戏和许可证密钥。
  • Base58 和 Base62 对于区分大小写的编码很有用。 Base58 还被设计为通过删除一些容易误读的字母来提高人类可读性。 Flickr、比特币和其他人使用 Base58。

在 NodeJS 中的十六进制编码是natively supported,可以这样做:

// Encode
var hex = new Buffer(string).toString('hex');

// Decode
var string = new Buffer(hex, 'hex').toString();

请务必注意,其中一些有不同的实现方式。例如,Flickr 和比特币使用不同的 Base58 实现。

【讨论】:

  • 感谢@Grokify!您提到的编码器中哪个编码器性能最高(最快)并且在 JavaScript 中原生支持?
  • 十六进制通常是性能最高的,因为它是本机实现的。链接的 SO Answer 中的 JS 实现看起来非常简单,所以我会尝试一下,看看它对你来说是否足够快。当你想要一个短编码字符串时,Base32/36/58/62 很好。
  • 嗨,Grokify,当您说“十六进制是本机实现的”时,您具体指的是哪些本机 JS 方法用于十六进制编码和解码?
  • 对于 JavaScript,您可以使用本机 Number.prototype.toString() 方法和 parseInt() 函数进行十六进制和最多 Base36 的转换。链接的 SO Answer 演示了在小型包装方法中使用这些方法。以下是一些 MDN 链接: toString() developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…; parseInt() developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 感谢 Grokify,如果我理解正确,尽管您提到的 toStringparseInt 方法适用于数字而不是字符串。
【解决方案2】:

为什么不把这两个字符串存储在不同的变量中,这样就不需要转换回来了?

要提取所有字母数字,您可以像这样使用正则表达式函数:

var str='dssldjf348902.-/dsfkjl';
var patt=/[^\w\d]*/g;
var str2 = str.replace(patt,'');

str2 变为 dssldjf348902dsfkjl

【讨论】:

  • 嗨@Trung,您建议的不是编码,而是替换。所以它没有回答这个问题。
猜你喜欢
  • 2021-12-24
  • 1970-01-01
  • 2013-01-04
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多