Как такую строку \208\181\208\180\208\181 вернуть обратно в русский (РЕШЕНО! - костыль с sed-ом и китайским кодом) ?

Изображение пользователя balamutick.

Уже сколько раз сталкивался с этой проблемой.

Иногда некоторые вэб-редакторы в такое превращают текст.

И некоторые программы.

И что это вообще ? UTF8 ? (изначально текст на русском был в UTF-8)

0
ayax - 24 Август, 2010 - 02:41
Изображение пользователя ayax.

Вот про web-редакторы зацеплюсь.

Я сталкивался с такой проблемой, когда переводил сайты с 1251 на utf-8.
И на сервере всё правильно настроил, и в БД, и в meta, и в редакторе - и всё равно время от времени нормально работающая страница могла превратиться вот в подобное непотребство.
Всё решилось включением в заголовоки строки header('Content-type: text/html; charset=utf-8');

Вот, ну это если у тебя проблема именно на страницах. Это решение(когда такие названия у файлов) я думаю ты уже увидел:)

0
balamutick - 24 Август, 2010 - 18:42
Изображение пользователя balamutick.

Нет, в данном случае у меня другая ситуация. С вэб-серверам я примерно так и справился, но у меня другой случай.

Тем не менее пусть будет для развития и для тех, кто в поиске найдёт эту тему.

+1
Xenomorph - 24 Август, 2010 - 22:50
Изображение пользователя Xenomorph.

#!/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);#закрываем запись

Пример входящего файла
Пример полученного файла

0
balamutick - 31 Август, 2010 - 03:18
Изображение пользователя balamutick.

Прикольно :-)

Заодно программирование подтянуть.
На первый взгляд я вроде вполне понял.

+1
balamutick - 25 Август, 2010 - 00:18
Изображение пользователя balamutick.

РЕШЕНИЕ тут->

Нигде не нашёл, таки сделал свой велосипед, блекджека просто дофига:

cat mlnet_strings.ru_RU.UTF-8 |sed 's/\\208\\177/б/g'|sed 's/\\208//g'|sed 's/\\209//g'|sed 's/\\176/а/g'|sed 's/\\178/в/g'|sed 's/\\179/г/g'|sed 's/\\180/д/g'|sed 's/\\181/е/g'|sed 's/\\145/ё/g'|sed 's/\\183/з/g'|sed 's/\\182/ж/g'|sed 's/\\184/и/g'|sed 's/\\185/й/g'|sed 's/\\186/к/g'|sed 's/\\187/л/g'|sed 's/\\188/м/g'|sed 's/\\189/н/g'|sed 's/\\190/о/g'|sed 's/\\191/п/g'|sed 's/\\128/р/g'|sed 's/\\129/с/g'|sed 's/\\130/т/g'|sed 's/\\131/у/g'|sed 's/\\132/ф/g'|sed 's/\\133/х/g'|sed 's/\\134/ц/g'|sed 's/\\135/ч/g'|sed 's/\\136/ш/g'|sed 's/\\137/щ/g'|sed 's/\\138/ъ/g'|sed 's/\\139/ы/g'|sed 's/\\140/ь/g'|sed 's/\\141/э/g'|sed 's/\\142/ю/g'|sed 's/\\143/я/g'|sed 's/\\144/А/g'|sed 's/\\145/Б/g'|sed 's/\\146/В/g'|sed 's/\\147/Г/g'|sed 's/\\148/Д/g'|sed 's/\\149/Е/g'|sed 's/\\129/Ё/g'|sed 's/\\151/З/g'|sed 's/\\150/Ж/g'|sed 's/\\152/И/g'|sed 's/\\153/Й/g'|sed 's/\\154/К/g'|sed 's/\\155/Л/g'|sed 's/\\156/М/g'|sed 's/\\157/Н/g'|sed 's/\\158/О/g'|sed 's/\\159/П/g'|sed 's/\\160/Р/g'|sed 's/\\161/С/g'|sed 's/\\162/Т/g'|sed 's/\\163/У/g'|sed 's/\\164/Ф/g'|sed 's/\\165/Х/g'|sed 's/\\166/Ц/g'|sed 's/\\167/Ч/g'|sed 's/\\168/Ш/g'|sed 's/\\169/Щ/g'|sed 's/\\170/Ъ/g'|sed 's/\\171/Ы/g'|sed 's/\\172/Ь/g'|sed 's/\\173/Э/g'|sed 's/\\174/Ю/g'|sed 's/\\175/Я/g'> new_mlnet

Между делом нашёл, как это делается в PHP:

Но куда и чего сувать в PHP, чтобы это сделать, ума не приложу.
0
balamutick - 25 Август, 2010 - 20:38
Изображение пользователя balamutick.

Люди, откопал жука !

Ответьте на простой вопрос:
Как заменить в файле строку типа \209\145 на букву ё ?

Проблема в том, что если написать так:
sed 's/\\209\145/ё/g'
То оно вылетает с ошибкой, так как первые два слэша позволяют с экранировать второй из них, а вот на следующем идёт спотыкание и его уже не позволяет экранировать...

0
Xenomorph - 25 Август, 2010 - 23:58
Изображение пользователя Xenomorph.

Еще раз заэкранируй, в чём проблема-то?
P.S. Скрипт от меня пробовал?
P.P.S. Скрипт проверил уже сам, всё работает как часы.

0
balamutick - 26 Август, 2010 - 01:41
Изображение пользователя balamutick.

Скрипты сумрачных гениев у меня не работают :-)

Мне надо на пальцах объяснить, что ещё туда добавить.

Еще раз заэкранируй, в чём проблема-то? Ну не дебил я вот в чём проблема, это я первым делом попробовал. Хотя вариант координально кривых рук, не исключён :-), у самого второе экранирование работает ?

+1
Xenomorph - 26 Август, 2010 - 03:31
Изображение пользователя Xenomorph.

sed 's/\\209\145/ё/g'может быть имелось в виду sed 's/\\208\\145/ё/g'
у самого второе экранирование работает? Работает. проверять нет особо на чём.
координальнокардинально, сколько можно же, граммар-наци негодуэ.
Свой скрипт прокомментировал до состояния "Шкиперу станет ясно"

0
balamutick - 27 Август, 2010 - 14:00
Изображение пользователя balamutick.

Проверить можно так:
echo "\208\145" > | sed 's/\\208\\145/ё/g'> result.txt

кардинально на лурке читал, и негодовал, ну кто же так может писать...
(гы, при том, что я уже тысячу раз замечал, что сам пишу неправильно).

Ещё меня можно подловить на словит "звонит", ибо я знаю как правильно произносить и произношу правильно, но поскольку знаю, что многие ошибаются, думаю что наверное и я ошибочно знаю и начинаю произносить неправильно.

Сто раз закопипастю слово правильно:

+1
Fatalist - 26 Август, 2010 - 09:18
Изображение пользователя Fatalist.

Так, вспомнилось в тему:
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: победил =)

Источник.

+1
Гость - 10 Февраль, 2012 - 14:20

#!/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";

перекодирование по желанию

Отправить комментарий

CAPTCHA на основе изображений
Введите цифры