【问题标题】:JavaScript Array join() cause null (%00) character in resultJavaScript Array join() 导致结果中出现空 (%00) 字符
【发布时间】:2016-08-02 08:18:03
【问题描述】:

我正在尝试通过RequireJs在js文件请求中加入水印:

requirejs.config({
    baseUrl: '/app',
    urlArgs:  [98, 121, 65, 68, 77].map(String.fromCharCode).join('')+'&v=1.0.0'
});

由于某些原因我不能直接输入byADM,所以我写了上面的代码。
我的问题是加入字符后,它在网址中显示b%00%00y%01%00A%02%00D%03%00M%04%00&v=1.0.0 而不是byADM&v=1.0.0。它看起来像 '' 转换为 %00
我该怎么做才能解决这个问题?
字符串库或其他东西中是否有任何真正的空字符?

【问题讨论】:

  • 在控制台中测试了你的代码,工作正常。当您只是 map,join,+ 时,您会得到正确的结果吗?
  • @Georgy 是的,在控制台中没问题,但我说我的问题是当这个字符串进入 url 时。
  • @Georgy:它看起来很好,因为您在使用 console.log 时看不到那些字符/字节值。首先应用 encodeURIComponent,你会看到它们出现。
  • 您的代码正在被转义。 unescape('b%00%00y%01%00A%02%00D%03%00M%04%00&v=1.0.0') 将正确返回 `byADM&v=1.0.0

标签: javascript arrays string ascii


【解决方案1】:

Array.prototype.map三个参数 传递给回调:currentValueindexarrayString.fromCharCode 接受任意数量的参数,一次将它们全部转换。本质上,您通过将String.fromCharCode 作为回调直接传递给map 来调用String.fromCharCode(98, 0, [])

您需要剔除附加参数:

[98, 121, 65, 68, 77].map((c) => String.fromCharCode(c))

但是,除了对抗这种行为,您还可以使用String.fromCharCode 接受任意数量参数的能力来简化您的代码:

String.fromCharCode.apply(String, [98, 121, 65, 68, 77]) + '&v=1.0.0'

或者,你知道……

String.fromCharCode(98, 121, 65, 68, 77) + '&v=1.0.0'

【讨论】:

  • 感谢您完成@CBroe answere。
  • 我认为这是更好的答案。怀疑是跟传给回调函数的参数有关,但没有去细查。 @MeTe-30,你可能应该接受这个。
  • @MeTe-30 facepalm 实际上有一个更好的解决方案……查看更新。
  • 谢谢!这与我的极简主义个性非常接近!
【解决方案2】:

我不知道究竟是为什么,但看起来你需要将 String.formCharCode 包装到一个额外的匿名函数中:

urlArgs:  [98, 121, 65, 68, 77].map(
  function(c) {
    return String.fromCharCode(c);
  }
).join('')+'&v=1.0.0'

【讨论】:

    猜你喜欢
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    相关资源
    最近更新 更多