日期中奇怪的隐藏角色

时间:2016-03-16 01:26:27

标签: javascript regex

我在IE解析日期时遇到了问题,我花了两个小时才知道我实际解析的日期中有隐藏的字符。

无视解析问题,我只想知道这些是什么?

alert("‎3‎/‎9‎/‎2016"==="3/9/2016")
alert("‎3‎/‎9‎/‎2016")
alert("3/9/2016")

JsFiddle

如果没有人解释,我如何修剪这些奇怪的字符以获得有效的字符串?

4 个答案:

答案 0 :(得分:6)

似乎就是这样:http://www.fileformat.info/info/unicode/char/200e/index.htm

我做了:"‎3‎/‎9‎/‎2016".charCodeAt(0)然后用Google搜索结果。

只需更换不符合预期的一切。在这种情况下,您似乎只想要数字或斜杠。所以忽略其他所有内容都是/[^\d\/]。所以这有效:

"‎3‎/‎9‎/‎2016".replace(/[^\d\/]/g, '') === '3/9/2016'

答案 1 :(得分:2)

使用charCodeAt我认为该符号是字符代码8026。然后我找到了another answer,这有助于解释您的问题。这是答案的相关部分。

  

您可能会获得LTR标记,因为您的显示区域设置是RTL。除此之外,请考虑区域设置始终会影响输出。也许您的语言环境使用dd / mm / yyyy格式而不是mm / dd / yyyy格式。或者您的语言环境可能需要亚洲或阿拉伯语字符。这些都是确定显示格式时的注意事项,但永远不适合机器解析。

tl; dr:问题源于获取基于机器的语言环境的输出,这是IE考虑的事情。如果语言环境显示RTL,IE输出LTR,或者它对亚洲或阿拉伯语言有一些奇怪的支持。

尽管如此,上述答案应该是您需要的所有信息:不要指望语言环境格式的文本可以在机器上使用,它们只是为了人类可读。当然,你可以过滤掉角色,但总有可能遇到另一种语言环境。

答案 2 :(得分:2)

(只是为了完整;显然这不符合评论。)

➜  ~ hexdump -C tmp.js
00000000  61 6c 65 72 74 28 22 e2  80 8e 33 e2 80 8e 2f e2  |alert("...3.../.|
00000010  80 8e 39 e2 80 8e 2f e2  80 8e 32 30 31 36 22 29  |..9.../...2016")|
00000020  0a 61 6c 65 72 74 28 22  33 2f 39 2f 32 30 31 36  |.alert("3/9/2016|
00000030  22 29 0a                                          |").|

答案 3 :(得分:1)

这些是left-to-right标记。 Unicode uE2808E。