2010-07-08 9 views
0

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

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

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

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

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

Я ухватился за соломинку здесь. Огромное спасибо всем, кто может помочь.


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

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

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

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

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

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

+0

Похоже, что текст может быть как-то сломан в пути * в * системе. Я не знаю, как код на стороне клиента будет знать, что ему нужно исправить, а тем более что он должен изменить любые сломанные символы. – Pointy

ответ

0

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

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 сущности, но я не знаю, это будет работать.

0

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

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

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

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

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

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

Смежные вопросы