Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Транскодер UTF-8 для JavaScript  (Прочитано 9491 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Daniloff
Помогающий

ru
Offline Offline

« : 09-03-2010 13:36 » 

Задача: открыть файл в кодировке UTF-8 и найти в нем требуемое слово.
Предыстория: оказывается, объект FileSystemObject не поддерживает вышеназванную кодировку в принципе.
Еще одно интересное открытие: текстовые строки, даже хранящиеся в скрипте в кодировке 1251, в памяти при выполнении хранятся в unicode!  Быть такого не может

Выполняя
Код:
var s="Мотя";
WScript.echo(escape(s));
получим "%u041C%u043E%u0442%u044F"

А вот такие скрипты, найденные в сети, работают с кириллицей криво.

пришлось мастерить побуквенный транскодер. Вот что получилось:
Код:
function transcode(s){
 var d="";
 d=escape(s);
 d=d.replace(/%u0420/g,"%u0420%A0");  //Р в первую очередь!
 d=d.replace(/%u0421/g,"%u0420%u040E");  //С тоже!
 d=d.replace(/%u0401/g,"%u0420%u0403");  // Ё

 d=d.replace(/%u0410/g,"%u0420%u0452"); //А
 d=d.replace(/%u0411/g,"%u0420%u2018"); //Б
 d=d.replace(/%u0412/g,"%u0420%u2019"); //В
 d=d.replace(/%u0413/g,"%u0420%u201C"); //Г
 d=d.replace(/%u0414/g,"%u0420%u201D"); //Д
 d=d.replace(/%u0415/g,"%u0420%u2022"); //Е
 d=d.replace(/%u0416/g,"%u0420%u2013"); //Ж
 d=d.replace(/%u0417/g,"%u0420%u2014"); //З
 d=d.replace(/%u0418/g,"%u0420%98");    //И
 d=d.replace(/%u0419/g,"%u0420%u2122");  //Й
 d=d.replace(/%u041A/g,"%u0420%u0459");  //К
 d=d.replace(/%u041B/g,"%u0420%u203A");  //Л
 d=d.replace(/%u041C/g,"%u0420%u045A");  //М
 d=d.replace(/%u041D/g,"%u0420%u045C");  //Н
 d=d.replace(/%u041E/g,"%u0420%u045B");  //О
 d=d.replace(/%u041F/g,"%u0420%u045F");  //П

 d=d.replace(/%u0422/g,"%u0420%u045E");  //Т
 d=d.replace(/%u0423/g,"%u0420%u0408");  //У
 d=d.replace(/%u0424/g,"%u0420%A4");  //Ф
 d=d.replace(/%u0425/g,"%u0420%u0490");  //Х
 d=d.replace(/%u0426/g,"%u0420%A6");  //Ц
 d=d.replace(/%u0427/g,"%u0420%A7");  //Ч
 d=d.replace(/%u0428/g,"%u0420%u0401");  //Ш
 d=d.replace(/%u0429/g,"%u0420%A9");  //Щ
 d=d.replace(/%u042A/g,"%u0420%u0404");  //Ъ
 d=d.replace(/%u042B/g,"%u0420%AB");  //Ы
 d=d.replace(/%u042C/g,"%u0420%AC");  //Ъ
 d=d.replace(/%u042D/g,"%u0420%AD");  //Э
 d=d.replace(/%u042E/g,"%u0420%AE");  //Ю
 d=d.replace(/%u042F/g,"%u0420%u0407");  //Я

 d=d.replace(/%u0430/g,"%u0420%B0"); // а
 d=d.replace(/%u0431/g,"%u0420%B1"); // б
 d=d.replace(/%u0432/g,"%u0420%u0406"); // в
 d=d.replace(/%u0433/g,"%u0420%u0456"); // г
 d=d.replace(/%u0434/g,"%u0420%u0491"); // д
 d=d.replace(/%u0435/g,"%u0420%B5"); // е
 d=d.replace(/%u0436/g,"%u0420%B6"); // ж
 d=d.replace(/%u0437/g,"%u0420%B7"); // з
 d=d.replace(/%u0437/g,"%u0420%u0451"); // и
 d=d.replace(/%u0439/g,"%u0420%u2116"); // й
 d=d.replace(/%u043A/g,"%u0420%u0454"); // к
 d=d.replace(/%u043B/g,"%u0420%BB"); // л
 d=d.replace(/%u043C/g,"%u0420%u0458"); // м
 d=d.replace(/%u043D/g,"%u0420%u0405");  // н
 d=d.replace(/%u043E/g,"%u0420%u0455");  // о
 d=d.replace(/%u043F/g,"%u0420%u0457");  // п
 d=d.replace(/%u0440/g,"%u0421%u0402");  // р
 d=d.replace(/%u0441/g,"%u0421%u0403");  // с
 d=d.replace(/%u0442/g,"%u0421%u201A");  // т
 d=d.replace(/%u0443/g,"%u0421%u0453");  // у
 d=d.replace(/%u0444/g,"%u0421%u201E");  // ф
 d=d.replace(/%u0445/g,"%u0421%u2026");  // х
 d=d.replace(/%u0446/g,"%u0421%u2020");  // ц
 d=d.replace(/%u0447/g,"%u0421%u2021");  // ч
 d=d.replace(/%u0448/g,"%u0421%u20AC");  // ш
 d=d.replace(/%u0449/g,"%u0421%u2030");  // щ
 d=d.replace(/%u044A/g,"%u0421%u0409");  // ъ
 d=d.replace(/%u044B/g,"%u0421%u2039");  // ы
 d=d.replace(/%u044C/g,"%u0421%u040A");  // ь
 d=d.replace(/%u044D/g,"%u0421%u040C");  // э
 d=d.replace(/%u044E/g,"%u0421%u040B");  // ю
 d=d.replace(/%u044F/g,"%u0421%u040F");  // я
 d=d.replace(/%u0451/g,"%u0421%u2018");  // ё
 return d;
}


Работает оно так:
Код:
var s="Мотя";
WScript.echo("unescaped s:",unescape(transcode(s)));

Если кто-нибудь предложит более изящное решение, буду благодарен! Улыбаюсь
Записан
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #1 : 09-03-2010 13:44 » 

Небольшая поправка - это не JavaScript, а JScript. Разница большая.
Тем не менее, посмотри тут по поводу UTF-8 в FileSystemObject:
http://social.msdn.microsoft.com/Forums/en-US/netfxjscript/thread/1aba83ce-d839-4ce7-83ea-0a4768921cbe
http://www.devguru.com/technologies/vbscript/quickref/filesystemobject_opentextfile.html
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Daniloff
Помогающий

ru
Offline Offline

« Ответ #2 : 09-03-2010 14:06 » 

Да, пожалуй, верно - JScript правильнее.
А ссылочки поглядел, там про unicode, он же UTF-16. Не то Улыбаюсь
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 09-03-2010 14:15 » 

Daniloff, а где ты в винде нашел UTF-8? Обрисуй задачу детальнее.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.

Хз, я не очень просто не очень во всё это верю, во всякие там сатурны и прочую поебень.
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #4 : 09-03-2010 14:22 » 

А ссылочки поглядел, там про unicode, он же UTF-16. Не то Улыбаюсь
По-моему UTF-8 - это тоже Unicode
UTF-8 — представление Юникода, обеспечивающее наилучшую совместимость со старыми системами, использовавшими 8-битные символы. Текст, состоящий только из символов с номером меньше 128, при записи в UTF-8 превращается в обычный текст ASCII. И наоборот, в тексте UTF-8 любой байт со значением меньше 128 изображает символ ASCII с тем же кодом. Остальные символы Юникода изображаются последовательностями длиной от 2 до 6 байт (на деле, только до 4 байт, поскольку в Юникоде нет символов с кодом больше 10FFFF, и вводить их в будущем не планируется), в которых первый байт всегда имеет вид 11xxxxxx, а остальные — 10xxxxxx.
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Daniloff
Помогающий

ru
Offline Offline

« Ответ #5 : 09-03-2010 14:27 » 

Daniloff, а где ты в винде нашел UTF-8? Обрисуй задачу детальнее.
есть html файл (да хоть txt, блокнотом сохраненный) в кодировке utf8.
вот так он будет выглядеть в 1251:
Код:
Р°Р+Р?Р?Р?РчжзийкР>Р?Р?Р?РїС?С?С'С?С"С:С┼С╪С?С%С?С<С?С?С?С?С'
нужно работать с этим текстом, искать совпадения с шаблоном, к примеру.

baldr, ну ладно, пусть в терминах он тоже - unicode, да не тот, что по ссылке. По ссылке - кодировка, каждый символ которой обозначен 2 байтами. А в utf-8 размер символа - от 1 до 4 байт...
« Последнее редактирование: 09-03-2010 14:31 от Daniloff » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 09-03-2010 14:30 » 

Daniloff, JScript поддерживает создание ActiveX-объектов. Посмотри, который там позволяет перекодировать и используй его. Если такового нет, то напиши сам. То, что в первом посте с кучей replace - это безобразие.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.

Хз, я не очень просто не очень во всё это верю, во всякие там сатурны и прочую поебень.
Daniloff
Помогающий

ru
Offline Offline

« Ответ #7 : 10-03-2010 08:51 » 

RXL, спасибо за совет! Улыбаюсь

вот как оно выглядит теперь:
Код: (Text)
/**** strConv(string,"windows-1251","utf-8") ****/

function strConv(txt, sourceCharset, destCharset){
 with(new ActiveXObject("ADODB.Stream"))
 {
  type=2, mode=3, charset=destCharset;
  open();
  writeText(txt);
  position=0, charset=sourceCharset;
  return readText().substr(3);
 }
}

P.S. А почему в теге "CODE" не работает подсветка синтаксиса? Улыбаюсь)
« Последнее редактирование: 10-03-2010 08:57 от Daniloff » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 10-03-2010 09:03 » new

Потому, что руки не дошли.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.

Хз, я не очень просто не очень во всё это верю, во всякие там сатурны и прочую поебень.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines