Posterous theme by Cory Watilo

Filed under: utf8

Работа. Перевод проекта с cp1251 на utf8. Подводный камень.

В предыдущем посте я перевел проект с cp1251 на utf8.
Все отлично работает, протестировал работу в FireFox, Safari и Opera.
Но когда решил протестировать в IE, оидн из интерфейсов отказывался работать, а именно - выскакивала JS-ошибка, мол пропущена точка-с-запятой, даже указывалась строка. Естественно данная строка была валидна.
После нескольких минут поиска "JS-ошибки", я понял, что это вовсе не ошибка.
В одном из подключаемых JS-скриптов (самописный плагин для jQuery) был комментарий в кодировке cp1251 и так как весь проект UTF-8, то IE не мог понять данный JS и выдавал ошибку на строку после подключения JS-скрипта.
После переведа скрипта в UTF-8 все заработало.
Вот тебе и комментарии :)
Original post http://sharifulin.livejournal.com/21024.html

Работа. Перевод проекта с cp1251 на utf8.

Обычная такая задача для любого разработчика - перевести проект с одной кодировки в другую.
Кроме того, что нужно перевести БД и научить скрипты работать с utf8-данными и отдавать их, нужно перевести все шаблоны и все исходники в UTF-8. Причем не просто с BOM-символом, а в UTF-8 Cookie  - в первых двух строчках должна быть кука - encoding="utf8" (кука зависит от настроек редактора, мне нравится такая :).
Для любителей рутины задача превосходная - открыл файл, добавил куку, сохранил как UTF-8 Cookie (так чтобы вся не латиница осталась корректной) и закрыл.
После того, как я перевел в ручную 2 файла, я устал (всего файлов несколько сотен).

Вот скрипт, который меня спас - написал за пол-часа:

#~ DIR=../tmpl/#~ ADD='encoding="utf-8"'DIR=../lib/ADD='encoding="utf-8"'find $DIR -type f | while read FILEdo        if [ ! -n "`cat $FILE | head -n2 | grep -i $ADD`" ]; then                echo $FILE                #~ perl -Mencoding=cp1251,STDOUT,utf8 -pe 1 <$FILE | perl -e "print qq{^[\`$ADD\`]\n}, <>;" | (rm $FILE; cat >$FILE)                perl -Mencoding=cp1251,STDOUT,utf8 -pe 1 <$FILE | perl -e "print do { chomp(\$_ = <>); /^#!/ ? \$_.' -CDSA' : \$_ }, qq{\nuse utf8; # $ADD\n}, <>;" | (rm $FILE; cat >$FILE)        fidone
 
С помощью первой части (та, что закомментирована) обошел все шаблоны и там где не было куки (кукой может являться атрибут encoding в <?xml ?>, если это xml-документ, поэтому пропускаем), добавил первой строкой ее в виде комментария шаблонизатора :) и поменял кодировку файла.
С помощью второй части (инвертирование комментарий) обошел все модули (а также тестирующие скрипты), произвел те же операции, только в качестве куки использовал Perl-прагму utf8 с необходимым комментарием, только это должна была быть вторая строка, а также ко всем скриптам добавил ключ запуска CDSA.

После чего, весь проект заработал в UTF-8.
Не сразу, конечно, в некоторых модулях первая и вторая строка была POD-документация и кука вставилась прямо в нее :)
После ручной коррекции, все заработало.


Original post http://sharifulin.livejournal.com/20563.html

Perl. Создание utf8-файлов c триплетом

Мне нужно было с помощью Perl создать UTF-8 файлы, т.е. первый символ - триплет.

Данная конструкция позволяет писать данные в файл в UTF-8, но не записывает триплет:

use utf8;  # encoding="utf-8"use strict;open my $fh, '>:utf8', 'test';

Я долго искал решение, так и не нашел как записать триплет (\x{...}), даже charmap не помог.

Затем поступил хитро - сохранил файл как UTF-8, открыл его в 8-bit и посмотрел начертание триплета:

п»ї
В UTF-8 триплет выглядит как небольшая точка с valign="top" :)

Решение проблемы нашел, но это hack, хочется найти адекватное решение.

P.S. Спасибо Scite за возможность работы с encoding.
Original post http://sharifulin.livejournal.com/6223.html