2011-11-14 137 views
1

当执行命令==之间2等于字符串的我得到的返回false。等于字符串比较返回false

以下代码:

在代码某处:

Arr.prod.push({ 
       "id" : product.id, 
       "nameProd" : product.name 
    }); 

在其它地方在代码:

var id; 
for(i in Arr.prod){ 
    if($.trim(str) == $.trim(Arr.prod[i].nameProd)){ 
     id = Arr.prod[i].id; 
    break; 
    } 
} 

i = 3,的Array.prod[i].nameProd值等于str值。这些变量的价值是:“DVD播放机Automotivo CED229X - Tela 3,Entrada USB Frontal,Entrada SD翻转e Controle Remoto - 飞利浦 - 飞利浦 - Americ ...”。但是比较总是返回错误。

出了什么问题?

EDIT

在迭代添加代码:

console.log('str = ' + $.trim(str).toLowerCase(), ', item = ' + 
$.trim(Arr.prod[i].nameProd).toLowerCase(), 'result = ' + 
($.trim(str).toLowerCase() == $.trim(Arr.prod[i].nameProd).toLowerCase())); 

RESULT

STR = DVD播放机automotivo ced229x - 截图3 '',ENTRADA USB额叶, entrada sd翻转e controle remot ...,item =电视46“led全高清 (1920 x 1080像素) - 46pfl7606d/78 - 智能电视流光溢彩2, 网络电视,C ...结果=假

STR = DVD播放机automotivo ced229x - 截图3 '',ENTRADA USB额叶, entrada sd flip down e controle remot ...,item =家庭影院c/dvd - 250 w rms,hdmi,divx,usb - hts3510/78 - philips - philips - americanas.com.br结果= false

str = dvd player automotivo ced229x - tela 3'',entrada usb frontal, entrada sd flip down e controle remot ...,item = notebook hp result = false

海峡= DVD播放机automotivo ced229x - 屏幕截图3 '',ENTRADA USB正面, ENTRADA SD翻转向下e CONTROLE REMOT ...,项目=捷尼斯重新预订结果 =假

海峡= DVD播放机automotivo ced229x - 屏幕截图3 '',entrada usb frontal, entrada sd翻转e controle remot ...,item = dvd player automotivo ced229x - tela 3'',entrada usb frontal,entrada sd flip down e controle remot ...结果=假

最后的比较应该是真实的

看看这个

console.log('str : ' + escape(str)); 
console.log('arr : ' + escape(Arr.prod[i].nameProd))); 

结果:

str : DVD%20Player%20Automotivo%20CED229X%20-%20Tela%203%27%27%2C%20Entrada%20USB%20Frontal%2C%20Entrada%20SD%20Flip%20Down%20e%20Controle%20Remot%20... 

arr : DVD%20Player%20Automotivo%20CED229X%20-%20Tela%203%27%27%2C%20Entrada%20USB%20Frontal%2C%20Entrada%20SD%20Flip%20Down%A0e%20Controle%20Remot%20... 

以后再看 “下” 字在2日志的:

在str中包含%20e%,因为在arr中包含%A0e%。

发生了什么事?

谢谢。

+0

把一个'控制台。 log($ .trim(str),$ .trim(Array.prod [i] .nameProd),$ .trim(str)== $ .trim(Array.prod [i] .nameProd));'between如果行。并告诉我们会发生什么。 –

+1

也可能不是错误的原因,但为什么你使用数组构造函数(作为命名空间或其他)? – Yoshi

+0

请尝试重现这与http://jsfiddle.net –

回答

0

出于某种原因,您的代码在单词“Down”(即%A0)后面生成一个非间断空格(ascii 160或A0)。

为什么发生这种情况我不知道,但那是你需要解决的问题。

如果你不能找出如何解决这个问题,那么你至少可以通过比较之前替换正常的空格非中断空格,这样的治疗症状:

$.trim(str).replace(/\xa0/g,' ') == $.trim(Arr.prod[i].nameProd.replace(/\xa0/g,' ')) 
+0

有趣。 变量str是通过“请求对话框”(http://developers.facebook.com/docs/reference/dialogs/requests/)发送到Facebook的消息的子字符串。稍后,我会请求回复处理消息(使用FQL - 表apprequest中的http://developers.facebook.com/docs/reference/fql/(http://developers.facebook.com/docs/reference/fql/) apprequest /)在列MESSAGE中)。我在消息中应用子字符串,然后插入到str变量中。可能Facebook更改了邮件的编码。 有一种方法来“规范化”所有字符串特定的编码?例如,'UTF-8'? – vctlzac

+0

这不是一个字符集问题,字符实际上是不同的。从一个charset转换为anoteher不会使非破坏空间进入正常空间afaik。 –

+0

正确。所以上面提出了唯一的解决方案? – vctlzac