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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с кодировкой сохранённого файла 
:(
    Опции темы
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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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