Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с кодировкой сохранённого файла 
:(
    Опции темы
lollollollol
Дата 15.1.2014, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Здравствуйте, ситуация такая:

На сервер был скачен текстовый файл с русским текстом, на сервере нет русского языка, и файл сохранился с текстом типа "Õîòèòå ïîõóäåòü", когда я скачал файл на мой комп, все символы такими и остались.

Вопрос: Как из этого файла получить снова русский текст? Работа с файлам будет выполняться программно, спасибо

Добавлено через 10 минут и 16 секунд
Utf8ToAnsi не работает
PM MAIL   Вверх
lollollollol
Дата 16.1.2014, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



ЧТо же это за кодировка, немогу ничего найти уже 4 часа!!!!!!!!!!!
Уже весь гугл и яндекс перелопатил!

Это сообщение отредактировал(а) lollollollol - 16.1.2014, 00:08
PM MAIL   Вверх
ZBugz
Дата 16.1.2014, 06:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



На сервере есть такая проблема, обычно на сервере это тупо ansi.
Хочешь что быбработало, используй unicode, точнее utf16le 
PM MAIL   Вверх
Romikgy
Дата 16.1.2014, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



или ссылку на сайт или файл в бинарном виде... походу одна из видов кириликов ....


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Illusion Dolphin
Дата 16.1.2014, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 36
Всего: 63



http://2cyr.com/decode/?lang=ru => Хотите похудеть


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
Akella
Дата 16.1.2014, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



как распознать кракозябры
http://habrahabr.ru/post/147843/
PM MAIL   Вверх
lollollollol
Дата 16.1.2014, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



ну да, я понял что это ansi, только не понял как из этого программно получить нормальный русский текст? 
Ну например открываю файл, читаю строку, строка в переменной 
Код

var
     text:string;

Как получить русский текст? Из какой в какую кодировку кодировать? Или может как0то посимвольно обрабатывать?

Добавлено через 4 минуты и 30 секунд
Расширенный режим: исходная кодировка: windows-1251
отображается как: windows-1251
т.е. получается оно просто windows-1251 кодирует в windows-1251 но на выходе заветные символы, как программно в делфи того же добиться?
PM MAIL   Вверх
lollollollol
Дата 16.1.2014, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Ничего не выходит, уже и всё из HtmlCPConvert перепробовал, и все примеры в гугле которе нашел. 

Я совсем не понимаю что требуется сделать чтобы вернуть в русский текст? Это же обычная windows1251, почему она так отображается?
PM MAIL   Вверх
lollollollol
Дата 16.1.2014, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



а вот так текст в винхексе выглядит
Код

Õîòèòå ïîõóäåòü

PM MAIL   Вверх
ZBugz
Дата 17.1.2014, 06:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



У тебя не кодировка не читается, у тебя контролы не читают ansi в windows server. Такое бывает.
Поэтому юзай UNICODE, т.е. записывай в нем и читай его
PM MAIL   Вверх
Alexiski
Дата 17.1.2014, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 12.12.2008

Репутация: нет
Всего: 1



Есть веоятность, что текст в 1251 был ошибочно воспринят как Latin-1 и уже в таком виде преобразовался в Unicode (Utf-8). То есть его нужно обратно в Latin-1, а потом уже прочитать как 1251. Как-то так..
PM MAIL   Вверх
lollollollol
Дата 17.1.2014, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Код

У тебя не кодировка не читается, у тебя контролы не читают ansi в windows server. Такое бывает.
Поэтому юзай UNICODE, т.е. записывай в нем и читай его 

Вот есть у меня гигобайты таких файлов, как теперь в русский текст вернуть их? какие функции использовать для преобразования в русский текст?


Нашел статью, http://habrahabr.ru/post/137061/
села как там сказано 
Код

  str:=Utf8ToAnsi(str);
  str:=AnsiToUtf8(str);

Не спасло абсолютно!

Добавлено через 2 минуты и 2 секунды
Код

str:=Utf8ToAnsi(str);

Даёт результат
Цитата

Oioeoa iiooaaou

PM MAIL   Вверх
lollollollol
Дата 17.1.2014, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Код

Функция SetCodePage, объявленная в модуле System.pas как

procedure SetCodePage(var S: AnsiString; CodePage: Word; Convert: Boolean);



У меня delphi 7  и нет этой функции, кто может скопировать у себя код этой функции и показать тут?

Это сообщение отредактировал(а) lollollollol - 17.1.2014, 11:24
PM MAIL   Вверх
lollollollol
Дата 17.1.2014, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



 smile 
PM MAIL   Вверх
lollollollol
Дата 17.1.2014, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Задача вообще решаема?
PM MAIL   Вверх
Romikgy
Дата 17.1.2014, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



да


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
lollollollol
Дата 17.1.2014, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



и в какую сторону копать?
PM MAIL   Вверх
Romikgy
Дата 17.1.2014, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



что бы подсказать в какую сторону копать, надо видеть что именно копать.. надо видеть не только то что вы копируете с разных мест , а первоисточник!!! вы же , просто сообщаете что у вас ничего не получилось... все ф-ции даны по работе с текстом, надо только из них создать правильную комбинацию...


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
lollollollol
Дата 17.1.2014, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Извиняюсь, мой косяк, вот первоисточник. 
Вопрос, каким алгоритмом вернуть русский текст? 

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  3.txt 0,03 Kb
PM MAIL   Вверх
Romikgy
Дата 17.1.2014, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



этот файл ни в каком виде не похож на русский.... по наличию пробела в файле можно подумать что это utf8 , но не русский....


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
lollollollol
Дата 18.1.2014, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Ну дак я и говорю, русский файл был скачен на сервер, который не поддерживает русский язык. И в результате неведамым мне образом так сохранён. 
Как теперь его в русский вернуть?
PM MAIL   Вверх
ФедосеевПавел
Дата 18.1.2014, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 1
Всего: 10



lollollollol, за 4 дня пора бы уже ознакомиться с кодировками, основами unicode.

Твой файл 3.txt при открытии в режиме просмотра hex - выглядит так:
Код
EF BB BF C3 95 C3 AE C3 B2 C3 A8 C3 B2 C3 A5 20
C3 AF C3 AE C3 B5 C3 B3 C3 A4 C3 A5 C3 B2 C3 BC

Первые три байта EF BB BF напоминают BOM.
Значит, открываем файл как utf-8, видим строку
Код
Õîòèòå ïîõóäåòü

Это уже можно принимать за искажённую строку. Выполнив несколько экспериментов по изучению перечня возможных кодировок на сервере (источнике данных - твоих файлов) при помощи сайта из поста Illusion Dolphin, можно понять, что в данном случае имеет место кодировка сохранения iso8859-15 (latin-9), читаемая нашими вьюверами как cp1251 (ansi).

Итак, чтобы получить из фразы "Хотите похудеть" в кодировке cp1251 файл 3.txt, нужно взять строку в кодировке cp1251 и провести преобразование iso8859-15 -> utf-8, т.е. ошибиться с кодировкой. И сохранить файл с BOM.

Обратное преобразование utf8 -> iso888859-15, и полученную строку с однобайтной кодировкой интерпретировать как строку в cp1251.
О готовых библиотеках для преобразования я ничего не знаю, т.к. ещё не приходилось заниматься, но можно их или поискать или выполнить самостоятельно - все таблицы кодировок опубликованы, например, iso8859 в Wikipedia.

По большому счету, из проблем - автоматический выбор таблицы кодировки. Думаю, что она решается или вопросом к пользователю с показом промежуточных результатов, или проверкой диапазона символов из файла диапазону символов в кадждой таблице. Не сбрасывай со счетов алгоритм на хабре, ссылку на который привел Akella. Может быть уже существуют готовые решения.
PM   Вверх
ФедосеевПавел
Дата 18.1.2014, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 1
Всего: 10



Есть официальный документ от Emarcadero - "Unicode_Delphi-RUS.pdf". Поищи его в сети.
PM   Вверх
Romikgy
Дата 18.1.2014, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



сильно искаженный вариант... вот что зашифровано "Х о т и т е  п о х у д е т ь "


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
lollollollol
Дата 18.1.2014, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



ФедосеевПавел, спасибо, подскажи 
Код

Обратное преобразование utf8 -> iso888859-15


Как это можно сделать?

Это сообщение отредактировал(а) lollollollol - 18.1.2014, 18:51
PM MAIL   Вверх
ФедосеевПавел
Дата 18.1.2014, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 1
Всего: 10



Повторюсь, я не знаю - т.к. нужда ещё не заставляла.

Полагаю, что есть готовые решения с кодировками. Тем более в Delphi.
А если вручную, то как-то так: составить свою таблицу соответствия символа в utf8 символу в кодовой таблице и потом заменять (учитывая, что каждый символ в utf8 может иметь размер от 1 до 6 байт).

Для самостоятельной работы можешь почитать 123BOMiso8859cp1251utf8, "Unicode_Delphi-RUS.pdf", utf8tools+примеры, Google и Yandex (Delphi+utf8+iso8859).

P.S. По поводу кодировки iso888859-15 я, конечно же, ошибся. Там iso888859-1.
PM   Вверх
ФедосеевПавел
Дата 18.1.2014, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 1
Всего: 10



Посмотри сюда.
PM   Вверх
lollollollol
Дата 19.1.2014, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Гениально!


Рабочий код, может кому пригодится!!!


Код

function StringToWideStringEx(const S: AnsiString; CodePage: Word): WideString;
var
  InputLength,
  OutputLength: integer;
begin
  InputLength := Length(S);
  OutputLength := MultiByteToWideChar(CodePage, 0, PAnsiChar(S), InputLength, nil, 0);
  SetLength(Result, OutputLength);
  MultiByteToWideChar(CodePage, 0, PAnsiChar(S), InputLength, PWideChar(Result), OutputLength);
end;

function WideStringToStringEx(const WS: WideString; CodePage: Word): AnsiString;
var
  InputLength,
  OutputLength: integer;
begin
  InputLength := Length(WS);
  OutputLength := WideCharToMultiByte(CodePage, 0, PWideChar(WS), InputLength, nil, 0, nil, nil);
  SetLength(Result, OutputLength);
  WideCharToMultiByte(CodePage, 0, PWideChar(WS), InputLength, PAnsiChar(Result), OutputLength, nil, nil);
end;


function TranslateString(const S: AnsiString; CP1, CP2: Word): AnsiString;
begin
  Result:= WideStringToStringEx(StringToWideStringEx(S, CP1), CP2);
end;


Используем так:

Код

str:=TranslateString(str,65001,28591);




Спасибо огромное всем кто откликнулся!!!!!

Добавлено через 11 минут и 4 секунды
Ещё вопрос по теме:

Если выполнить эту функцию на сервере где нет русского языка, преобразование будет выполнено верно? 

PM MAIL   Вверх
ZBugz
Дата 19.1.2014, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Цитата(lollollollol @ 19.1.2014,  00:24)
Если выполнить эту функцию на сервере где нет русского языка, преобразование будет выполнено верно?

Ну это тебе проще проверить. напиши проект пустой с этой функцией и проверь smile 
А вообще бы раньше бы написал бы, что у тебя делфи 7. С ней там как раз надо работать через такие вот примеры свыше.

Добавлено через 4 минуты и 45 секунд
Я еще такое юзал как то давно (по названию функции понятно):
Код

function UTF8ToStrSmart(Value: String): String;


      function UTF8ToStr(Value: String): String;
      var
        buffer: Pointer;
        BufLen: LongWord;
      begin
        BufLen := Length(Value) + 4;
        GetMem(buffer, BufLen);
        FillChar(buffer^, BufLen, 0);
        MultiByteToWideChar(CP_UTF8, 0, @Value[1], BufLen - 4, buffer, BufLen);
        Result := WideCharToString(buffer);
        FreeMem(buffer, BufLen);
      end;


var
  Digit: String;
  i: integer;
  HByte: Byte;
  Len: Byte;
begin
  Result := '';
  Len := 0;
  if Value = '' then Exit;
  for i := 1 to Length(Value) do
  begin
    if Len > 0 then
    begin
      Digit := Digit + Value[i];
      Dec(Len);
      if Len = 0 then
        Result := Result + UTF8ToStr(Digit);
    end else
    begin
      HByte := Ord(Value[i]);
      if HByte in [$00..$7f] then       //Standart ASCII chars
        Result := Result + Value[i]
      else begin
        //Get length of UTF-8 char
        if HByte and $FC = $FC then
          Len := 6
        else if HByte and $F8 = $F8 then
          Len := 5
        else if HByte and $F0 = $F0 then
          Len := 4
        else if HByte and $E0 = $E0 then
          Len := 3
        else if HByte and $C0 = $C0 then
          Len := 2
        else begin
          Result := Result + Value[i];
          Continue;
        end;
        Dec(Len);
        Digit := Value[i];
      end;
    end;
  end;
end; 
 




PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1476 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.