2017-02-09 11 views
0

Я пришел по странному поведению javascript сегодня, что, вероятно, связано с проблемой кодирования символов. Функция длины возвращает два разных количества символов для того, что, по-видимому, является одной и той же строкой. В одном экземпляре строка была скопирована из значения базы данных, во втором случае я вручную написал символы с помощью моей клавиатуры. Я уверен, что это связано с UTF, но я не могу понять, как получить «правильный» счетчик символов. Есть ли способ узнать, какая кодировка ошибочной строки находится и как-то исправить? Есть ли способ заставить каждую строку в моем приложении быть UTF-8? Есть ли где-нибудь скрытый персонаж?javascript's String.length возвращает неверный счетчик символов

Спасибо за вашу помощь

var utils = { 

/** 
* cleans up our url before db insertion 
* 
* @param url 
* @returns {String} the cleaned url 
*/ 
cleanUrl : function(url){ 
    url = url.trim().toLowerCase(); 
    if(url.includes('?'))return url; 

    var lastChar = url.charAt(url.length-1); 
    console.log('lastchar = ' + lastChar); 
    if(lastChar == '/'){ 
     url=url.substring(0, url.length-1); 
    } 
    return url; 
}, 

doTest : function(){ 
    var url = "https://bitcointalk.org/‎"; //this string was taken from DB 
    console.log('url length ' + url.length); 
    console.log('url length ' + url.trim().length); 
    var cleaned = this.cleanUrl(url); 
    console.log('cleaned length ' + cleaned.length); 
    console.log('cleaned ' + cleaned); 


    console.log('------------------------------'); 

    var url2 = "https://bitcointalk.org/"; //this string was manually written 
    console.log('url2 length ' + url2.length); 
    console.log('url2 length ' + url2.trim().length); 

    var cleaned2 = this.cleanUrl(url2); 
    console.log('cleaned2 length ' + cleaned2.length); 
    console.log('cleaned2 ' + cleaned2); 

} 
}; 

    utils.doTest() 

А вот выход:

url length 25 
url length 25 
lastchar = ‎ 
cleaned length 25 
cleaned https://bitcointalk.org/‎ 
------------------------------ 
url2 length 24 
url2 length 24 
lastchar =/
cleaned2 length 23 
cleaned2 https://bitcointalk.org 
+0

Ваш первый «очищенный» url не имеет '/' удален из него ... –

+0

@CallumLinington нет, это не так, потому что в первом случае есть скрытый символ после/ – azpublic

+0

Консоль Chrome показывает этот символ как красная точка, когда вы вставляете ее. –

ответ

2

Вы правильно! Существует секретный символ, закодированный из БД, который вы можете увидеть, если вы скопируете обе свои строки и попробуйте в консоли своего браузера.

+0

Скорее всего, это пробельный символ юникода, который наши браузеры усекают, но технически изменяет длину строки. – null

+0

ну на самом деле он даже не отображается в webstorm ... и у меня есть кодировка файла, установленная в UTF8 в webstorm ... coul dthis be UTF16? Как получить этот символ для отображения в моем коде lol – azpublic

+0

Также странно, что trim() не удаляет этот символ – azpublic

1

Я проверил вашу строку, которая скопирована из БД и содержит некоторые специальные символы. SO для этого вы можете использовать метод javascript encodeURIComponent() для этой строки, а затем сохранить эту закодированную строку в БД и при извлечении выполнить команду decodeURIComponent() в этой строке.