Character encoding html表单post中奇怪的前导unicode

Character encoding html表单post中奇怪的前导unicode,character-encoding,Character Encoding,偶尔会出现以下错误: An invalid character was found in the mail header: '‎' 这没有任何意义,经过调查,似乎有一些无形的字符在那里 我知道这是哪个用户,所以我从数据库中选择他们: select email from user where email = 'their@address.com' 用户的电子邮件显示为their@address.com,但将其复制到文本编辑器中,会显示wierd前导字符: 那么,当sql相等运算符不是同一个字

偶尔会出现以下错误:

An invalid character was found in the mail header: '‎'
这没有任何意义,经过调查,似乎有一些无形的字符在那里

我知道这是哪个用户,所以我从数据库中选择他们:

select email from user where email = 'their@address.com'
用户的电子邮件显示为
their@address.com
,但将其复制到文本编辑器中,会显示wierd前导字符:

那么,当sql相等运算符不是同一个字符串时,为什么它会匹配呢?因为它是一些看不见的字符

如果我将文本文件中的前导字符保存为unicode并在十六进制编辑器中打开它,我会看到:

FF FE 0E 20

更新:有问题的字节是:

E2 80 8E
这是什么疯狂,是怎么做到的

我如何防止将来出现这种情况,以及如何清理我的数据库(因为其中有一些)

以下是创建用户时的相关标题:

Content-Type: application/x-www-form-urlencoded
Accept: application/json, text/javascript, */*; q=0.01
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
谢谢

FFFE是一个好朋友

编辑:

0E20是。不知道这是从哪里来的。

FFFE是一个很好的例子

编辑:


0E20是。不知道从哪里来。

字节FF FE是UTF-16BE编码中的U+FEFF字节顺序标记,0E 20是相同编码中的U+200E从左到右标记。在文件的开头,它们是无害的,至少如果内容是在从左到右的书写系统中,如拉丁字母


我无法猜测它们的来源,特别是因为我不太清楚讨论的是什么文件以及它是如何创建的(从表单帖子?从数据库?其他方式?如何创建?)

字节FF FE是UTF-16BE编码中的U+FEFF字节顺序标记,0E 20是相同编码中的U+200E从左到右标记。在文件的开头,它们是无害的,至少如果内容是在从左到右的书写系统中,如拉丁字母


我无法猜测它们的来源,特别是因为我不太清楚讨论的是什么文件以及它是如何创建的(从表单帖子?从数据库?其他方式?如何创建的?)

哦,我明白了,所以这只是文本文件的开始,与此无关。重要的是
0E20
吗?用有问题的字节更新了问题,我明白了,原来把它搞砸了,所以这只是文本文件的开始,与此无关。重要的是
0E20
吗?用有问题的字节更新了问题,把问题搞砸了。我正在将有问题的字符保存到文件中,这样我就可以简单地得到它们的十六进制。感谢您对BOM的澄清,学到了一些新的东西:)我更新了问题E280 8E是U+0E20的UTF-8编码形式。(我用)很抱歉我最初的困惑;我已相应地编辑了我的答案。E2 80 8E是U+0E20的UTF-8,但数据很可能并不包含它,而是U+200E,它的字节顺序与UTF-16相反。因此,您从UTF-16BE数据中获得的数据被误解为UTF-16LE数据,然后转换为UTF-8。因此,即使是字节顺序标记本身也被错误地解释为错误的结尾。我查看了整个
POST
的日志,电子邮件字段是唯一一个前导
U+200E
的字段,所以我猜他们是从一封编码错误的电子邮件中复制并粘贴电子邮件地址到该字段的。我如何才能去掉这些字符?我已经在验证电子邮件地址了,它通过了,可能是这个特殊的字符在欺骗我的代码?我正在将有问题的字符保存到文件中,这样我就可以简单地获取它们的十六进制。感谢您对BOM的澄清,学到了一些新的东西:)我更新了问题E280 8E是U+0E20的UTF-8编码形式。(我用)很抱歉我最初的困惑;我已相应地编辑了我的答案。E2 80 8E是U+0E20的UTF-8,但数据很可能并不包含它,而是U+200E,它的字节顺序与UTF-16相反。因此,您从UTF-16BE数据中获得的数据被误解为UTF-16LE数据,然后转换为UTF-8。因此,即使是字节顺序标记本身也被错误地解释为错误的结尾。我查看了整个
POST
的日志,电子邮件字段是唯一一个前导
U+200E
的字段,所以我猜他们是从一封编码错误的电子邮件中复制并粘贴电子邮件地址到该字段的。我如何才能去掉这些字符?我已经在验证电子邮件地址,它通过了,大概这个特殊的字符在欺骗我的代码?