Я сталкивался с такой проблемой, когда переводил сайты с 1251 на utf-8.
И на сервере всё правильно настроил, и в БД, и в meta, и в редакторе - и всё равно время от времени нормально работающая страница могла превратиться вот в подобное непотребство.
Всё решилось включением в заголовоки строки header('Content-type: text/html; charset=utf-8');
#!/usr/bin/perl $flr='input.inp'; #файл, с которого читаем. заменяем на свой. $flw='>output.out'; #файл, в который пишем, заменяем на свой, ">" оставляем обязательно!!! open (INPUT, $flr); #открываем для чтения open (OUTPUT, $flw);#открываем для записи while (<INPUT>) { #пока файл считывается(аналог while(!EOF)), считываем строчку из файла в переменную $_ s/(\\\d{3})/chr(substr($1,1,3))/eg; #изменяем переменную $_ таким образом #{ #ищем группу "()" из бекслеша "\\" и трех любых цифр"\d{3}". #в найденной группе "$1" пропускаем первый символ("\") и выбираем 3 следующих символа "substr($1,1,3)" #преобразуем полученный результат в символ, отвечающий номеру. #"/eg" - 'e' - execute, 'g' - global; #} print OUTPUT $_; #записываем строку в файл } close(INPUT);#закрываем чтение close (OUTPUT);#закрываем запись Пример входящего файла Пример полученного файла
Ответьте на простой вопрос:
Как заменить в файле строку типа \209\145 на букву ё ?
Проблема в том, что если написать так: sed 's/\\209\145/ё/g'
То оно вылетает с ошибкой, так как первые два слэша позволяют с экранировать второй из них, а вот на следующем идёт спотыкание и его уже не позволяет экранировать...
Мне надо на пальцах объяснить, что ещё туда добавить.
Еще раз заэкранируй, в чём проблема-то? Ну не дебил я вот в чём проблема, это я первым делом попробовал. Хотя вариант координально кривых рук, не исключён :-), у самого второе экранирование работает ?
sed 's/\\209\145/ё/g'может быть имелось в виду sed 's/\\208\\145/ё/g' у самого второе экранирование работает? Работает. проверять нет особо на чём. координальнокардинально, сколько можно же, граммар-наци негодуэ.
Свой скрипт прокомментировал до состояния "Шкиперу станет ясно"
Так, вспомнилось в тему: sceptic> А чем можно в шелле перевести dec -> hex?
nazgul> sceptic: echo "1024" | awk ' { arr="0123456789abcdef"; a=$1; r=""; while (a>0) { r=substr(arr, a%16+1,1) r; a=int(a/16); }; printf "%s\n",r }; '
nazgul> sceptic: с нулём только косяк будет. но там поправить несложно
hekp0maht> $ printf "%x\n" 1024
400
nazgul> hekp0maht: победил =)
Вот про web-редакторы зацеплюсь.
Я сталкивался с такой проблемой, когда переводил сайты с 1251 на utf-8.
И на сервере всё правильно настроил, и в БД, и в meta, и в редакторе - и всё равно время от времени нормально работающая страница могла превратиться вот в подобное непотребство.
Всё решилось включением в заголовоки строки
header('Content-type: text/html; charset=utf-8');
Вот, ну это если у тебя проблема именно на страницах. Это решение(когда такие названия у файлов) я думаю ты уже увидел:)
Нет, в данном случае у меня другая ситуация. С вэб-серверам я примерно так и справился, но у меня другой случай.
Тем не менее пусть будет для развития и для тех, кто в поиске найдёт эту тему.
#!/usr/bin/perl
$flr='input.inp'; #файл, с которого читаем. заменяем на свой.
$flw='>output.out'; #файл, в который пишем, заменяем на свой, ">" оставляем обязательно!!!
open (INPUT, $flr); #открываем для чтения
open (OUTPUT, $flw);#открываем для записи
while (<INPUT>) { #пока файл считывается(аналог while(!EOF)), считываем строчку из файла в переменную $_
s/(\\\d{3})/chr(substr($1,1,3))/eg;
#изменяем переменную $_ таким образом
#{
#ищем группу "()" из бекслеша "\\" и трех любых цифр"\d{3}".
#в найденной группе "$1" пропускаем первый символ("\") и выбираем 3 следующих символа "substr($1,1,3)"
#преобразуем полученный результат в символ, отвечающий номеру.
#"/eg" - 'e' - execute, 'g' - global;
#}
print OUTPUT $_; #записываем строку в файл
}
close(INPUT);#закрываем чтение
close (OUTPUT);#закрываем запись
Пример входящего файла
Пример полученного файла
Прикольно :-)
Заодно программирование подтянуть.
На первый взгляд я вроде вполне понял.
Люди, откопал жука !
Ответьте на простой вопрос:
Как заменить в файле строку типа \209\145 на букву ё ?
Проблема в том, что если написать так:
sed 's/\\209\145/ё/g'
То оно вылетает с ошибкой, так как первые два слэша позволяют с экранировать второй из них, а вот на следующем идёт спотыкание и его уже не позволяет экранировать...
Еще раз заэкранируй, в чём проблема-то?
P.S. Скрипт от меня пробовал?
P.P.S. Скрипт проверил уже сам, всё работает как часы.
Скрипты сумрачных гениев у меня не работают :-)
Мне надо на пальцах объяснить, что ещё туда добавить.
Ну не дебил я вот в чём проблема, это я первым делом попробовал. Хотя вариант координально кривых рук, не исключён :-), у самого второе экранирование работает ?
может быть имелось в видуsed 's/\\208\\145/ё/g'
Работает. проверять нет особо на чём.
кардинально, сколько можно же, граммар-наци негодуэ.
Свой скрипт прокомментировал до состояния "Шкиперу станет ясно"
Так, вспомнилось в тему:
Источник.
#!/usr/bin/perl -w
use Encode;
$str='?\208?\162?\208?\181?\209?\133?\208?\189?\208?\184?\209?\135?\208?\181?\209?\129?\208?\186?\208?\176?\209?\143 ?\208?\180?\208?\190?\208?\186?\209?\131?\208?\188?\208?\181?\208?\189?\209?\130?\208?\176?\209?\134?\208?\184?\209?\143';
$str=~s/\?\\([0-9]+)\?\\([0-9]+)/sprintf("%c%c",$1,$2)/eg;
$str = decode('UTF8', $str);
$str = encode('KOI8-U', $str);
print "OUT=$str\r\n";
перекодирование по желанию
Отправить комментарий