Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2011, 00:50   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию Перекодировать файл в UTF-8->ANSI, ANSI -> UFT-8

Доброго времени!

Собственно вопрос как распознать кодировку файла(ansi, utf-8)?
как перекодировать файл из ansi в UFT-8 и наоборот?

Чем отличается кодировка utf-8 от uft-8 без метки BOM?
Человек_Борща вне форума Ответить с цитированием
Старый 19.05.2011, 02:40   #2
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
По умолчанию

почитай http://stackoverflow.com/questions/4...-ansi-vs-utf-8
возможно, что-то окажется полезным
maxionans вне форума Ответить с цитированием
Старый 19.05.2011, 03:07   #3
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,501
По умолчанию

http://programmersforum.ru/showthread.php?p=78214

Узнать кодировку файла можно по первум двум или трём байтам. обычно там указана кодировка.
Alar вне форума Ответить с цитированием
Старый 19.05.2011, 14:10   #4
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию

для перекодирвки вроде есть функции AnsiToUtf8() Utf8ToAnsi()
различие между кодирвками с bom или без, отличается наличием этого бум, сигнатуры (вроде 3 байта) в начале файла, если не изменяет память $ef $bb $bf (это для utf8)
Могу лишь пнуть в нужном направлении (ну или как получится)
Swarog вне форума Ответить с цитированием
Старый 19.05.2011, 15:11   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

окей... в UTF8(вместе с BOM) стабильно первые 3 байта это:
Код:
function IsUTF8File(aFileName: string): Boolean;
var
  fS: TFileStream;
  Bytes: array[0..2] of Byte;
begin
  Fs := TFileStream.Create(aFileName, fmOpenReadWrite);
  try
    fS.Seek(0, soFromBeginning);
    fS.ReadBuffer(Bytes, 3);
    if (Bytes[0] = $EF) or (Bytes[0] = $BB) or (Bytes[0] = $BF) then
      Result := True
    else
      Result := False;
  finally
    FreeAndNil(fS);
  end;
end;
тепрь как определить что кодировка ANSI или UTF-8(NoBOM)
Человек_Борща вне форума Ответить с цитированием
Старый 19.05.2011, 16:14   #6
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию

только методом предположения, допустим имеем русский текст анализируем весь текст ищем расширенные символы (те что по два байта) если первый байт в диапазоне $40..$47 то это русская таблица, дальше анализируем если все символы текста попадают в эту русскую таблицу или латинскую таблицу (она занимает 1 байт $00..$7f) то делаем вывод что текст в юникоде, если же часто встречаются "чужие" таблицы или данные слишком часто перемеживаются то делаем вывод что данные записаны в ANSI кодировке, ну вот как то так
Могу лишь пнуть в нужном направлении (ну или как получится)
Swarog вне форума Ответить с цитированием
Старый 19.05.2011, 18:35   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
тепрь как определить что кодировка ANSI или UTF-8(NoBOM)
Правильный ответ - убедиться, что ты всегда используешь UTF-8, либо что он всегда имеет BOM.

Ссылки для чтения:
http://msdn.microsoft.com/en-us/libr...72(VS.85).aspx
http://docwiki.embarcadero.com/RADSt...rsion_Routines
http://www.transl-gunsmoker.ru/2010/...xtunicode.html
http://www.transl-gunsmoker.ru/2010/...g-post_10.html
http://www.transl-gunsmoker.ru/2010/12/unicode_16.html
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 19.05.2011, 18:47   #8
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию

еще поправочка

Код:
function IsUTF8File(aFileName: string): Boolean;
var
  fS: TFileStream;
  Bytes: array[0..2] of Byte;
begin
  Fs := TFileStream.Create(aFileName, fmOpenReadWrite);
  try
    fS.Seek(0, soFromBeginning);
    fS.ReadBuffer(Bytes, 3);
    if (Bytes[0] = $EF) and (Bytes[1] = $BB) and (Bytes[2] = $BF) then
      Result := True
    else
      Result := False;
  finally
    FreeAndNil(fS);
  end;
end;
Могу лишь пнуть в нужном направлении (ну или как получится)

Последний раз редактировалось Swarog; 19.05.2011 в 18:50.
Swarog вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как конвертнуть файл ANSI to UCS2(LE) MakTpaxep Общие вопросы C/C++ 1 18.02.2011 17:57
Ansi в UTF-8 и наоборот UTF-8 в Ansi Alar Работа с сетью в Delphi 3 09.12.2010 17:02
Работа с ANSI и UTF-8 Farrel Visual C++ 2 22.09.2010 23:00
Как можно пересохранить текстовый файл в кодировке ANSI? Velross Общие вопросы Delphi 1 11.12.2009 18:26
ANSI HunterMan Win Api 2 18.04.2008 23:17