Использование JavaScript для исправления плохо закодированных символов Юникода - PullRequest
0 голосов
/ 09 июля 2010

Я работаю над веб-сайтом с системой управления контентом, которая плохо отображает любой текст с не-ASCII-символами.Например, правильные одинарные кавычки отображаются как на следующей веб-странице (это только пример, а не с веб-сайта, управляемого CMS):

http://www.gregboettcher.com/cmsunicode.html

Я могу 'я не могу контролировать внутреннюю работу CMS, но все же я хотел бы попытаться как-то исправить этот глюк.

Я попытался возиться с определением кодировки страницы, но изменил его с UTF-8 на ANSIили UCS-2 только усугубил ситуацию.

Вот мой главный вопрос: можно ли использовать JavaScript, чтобы как-то найти плохо закодированные символы Юникода и заставить их правильно отображаться?

Я хватаюсь за соломинкуВот.Большое спасибо всем, кто может помочь.


Отредактировано 12 июня:

Всем, кто ответил, спасибо за некоторые полезные ответы на довольно расплывчатый вопрос.

Я рассмотрел это еще немного, и похоже, что CMS записывает UTF-8 в базу данных, но затем читает его из базы данных с ожиданием чего-то отличного от UTF-8 (хотя тогда он создает веб-страницы, которыескажем "charset = UTF-8").

Я согласен, что, вероятно, было бы лучше попытаться исправить это, не допуская записи не-ASCII-символов в базу данных, но с CMS, которую я использую,это не очень практично.

Я сказал своему руководителю, что мы все еще можем использовать JavaScript, чтобы исправить проблему на стороне клиента, но когда я объяснил, что это будет делать, он сказал мне не беспокоиться.Кажется, он удовлетворен тем, что понимает причину проблемы, и передает сообщение об ошибке создателям CMS.

Так что спасибо - я узнал кое-что о кодировании текста и JavaScript из этого.

Ответы [ 2 ]

0 голосов
/ 09 июля 2010

В зависимости от количества участников, использующих CMS, честно говоря, я думаю, что самая безопасная и простая из возможных ставок - попытаться перечислить всех нелегальных персонажей и предоставить свои собственные замены.По моему опыту, список обычно довольно мал - четыре умных кавычки, m-тире, многоточие, неразрывный пробел, как правило, единственные преступники, которых я вижу.Каждая компания может немного отличаться (некоторые компании часто используют TM, Copyright и Registered, но вы часто будете видеть этих персонажей, и вам нужно будет добавить их в свой список только один раз).Акценты и диакритические знаки в настоящее время не являются проблемой.

Я подозреваю, что проблема усложняется из-за того, что кодировка символов для этих символов, кажется, связана с шрифтом, который выбирает пользователь - это единственный способ, которым я могу объяснить двух пользователей, сидящих рядомна одинаково настроенных машинах, производящих разные расширенные символы.Поэтому выполните поиск по тексту вашего сайта для любых расширенных символов и добавьте их вручную в файл JavaScript, сохраненный в UTF-8.

Пример кода может выглядеть следующим образом:

strProblemText = "“I’d say, ‘Get’em all…” – Pokemon Master©";
arrExtendedChars = "“”‘’…–©".split('')
arrReplacements = ['"','"',"'","'",'...','-','©'];
for (var i = 0; i < arrExtendedChars.length; i++) {
    strProblemText = strProblemText.replace(new RegExp(arrExtendedChars[i],"ig"),arrReplacements[i])
}
alert(strProblemText);

Синтаксис второй строки представляет собой небольшую головную боль, но он в основном разбивает строку на массив из отдельных символов и позволяет хранить все проблемные символы вместе в одной строке.Мне просто легче поддерживать.Другие могут немного не согласиться.Третьи все еще могут думать, что я безумен.

Как уже упоминалось @Pointy, лучше всего делать это, когда текст поступает в базу данных, или, по крайней мере, до его отправки на страницу пользователя, но делать это после того, как текст был отправлен изагруженный вариант по-прежнему является жизнеспособным.

0 голосов
/ 09 июля 2010

Попробуйте использовать этот код javascript:

window.onload = function() {
  var input=document.body.innerHTML; 
  var output = ''; 
  for(i=0; i < input.length; ++i) { 
    code = input.charCodeAt(i); 
    if (code > 256) {
        output += '&#' + code + ';'; 
    } else {
        output += input[i]; 
    }
  }
  document.body.innerHTML=output;
}

Он заменит все символы, не входящие в ASCII, номером объекта html, но я не знаю, будет ли это работать.

...