Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.24;
Скачать: CL | DM;

Вниз

Список кодировок   Найти похожие ветки 

 
leonidus   (2004-09-14 09:20) [0]

Мастера нужен совет. Очень надо получить список всех колироввок установленных на данном компе (как их показывает IE) и для каждой кодировки получить набор символов что бы можно было очуществялять перекодировку html-документов. Я так понимаю что кодировки это просто файлы которые можно подгрузить из интернета, а значит они где-то хранятся на винте. Подскажите пожалуйста куда копать.


 
Суслик ©   (2004-09-14 10:47) [1]

если я правильно понял вопрос, то копать сюда

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/nls_19f8.asp

см. функции из этого раздела


 
leonidus   (2004-09-14 11:01) [2]

ну да кудато в ту сторону, но там ничего конкретного нет:)


 
Суслик ©   (2004-09-14 11:14) [3]


>  [2] leonidus   (14.09.04 11:01)


> но там ничего конкретного нет:)

Неправда.
Я когда смотрел его видел и пробовал функции выдающие установленные кодировки и пр.
Приводить название функции не буду, т.к. не помню. Но все что кассается языков, кодировок и пр. описано именно в этом разделе.


 
TUser ©   (2004-09-14 11:17) [4]

EnumSystemCodePages, кажется


 
Суслик ©   (2004-09-14 11:23) [5]

Автору.

Если будешь пользоваться EnumSystemCodePages, то описывай callback функцию с результатом integer и возвращай 1. Если опишешь с результатом BOOL и будешь возвращать TRUE, то работать не будет - у них (microsoft) там, если не ошибка, то отклонение от стандарта - за true они считаю именно 1, а не как положено: не 0.


 
leonidus   (2004-09-14 15:57) [6]

пошарился по инету в поисках описания функции EnumSystemCodePages - всего три упоминания и то на Си, посмотрел справку и в упор не понял, а что собственн я этой функции должен передать и чего от не ожидать (ну понятно что boolean) но это получается вроде ответ на то что в процедуру подано на вход, но какое это имее отношение к списку кодировок установленных в системе и тем более к возможности перекодирования html-файлов?


 
leonidus   (2004-09-14 15:57) [7]

пошарился по инету в поисках описания функции EnumSystemCodePages - всего три упоминания и то на Си, посмотрел справку и в упор не понял, а что собственн я этой функции должен передать и чего от не ожидать (ну понятно что boolean) но это получается вроде ответ на то что в процедуру подано на вход, но какое это имее отношение к списку кодировок установленных в системе и тем более к возможности перекодирования html-файлов?


 
Sergey Kaminski ©   (2004-09-14 20:19) [8]

Суслик ©   (14.09.04 11:23) [5]

у них (microsoft) там, если не ошибка, то отклонение от стандарта - за true они считаю именно 1, а не как положено: не 0.


Позвольте узнать, в каком таком стандарте True=0?!


 
Суслик ©   (2004-09-14 20:40) [9]


>  [8] Sergey Kaminski ©   (14.09.04 20:19)

читай внимательней


> то отклонение от стандарта - за true они считаю именно 1,
> а не как положено: не 0.

я как раз и имел в виду, что за true считает не 0.

Беда в том, что если указанную callback фукнцию описать также как это сделано в мсдн (т.е. с результатом bool), то при присвоении ей true реально получается "-1", а фукнция требует именно 1!
Я долго с этим в свое время разбирался.

Даже на форуме это было. Со мной даже ИШ согласился.


 
Суслик ©   (2004-09-14 20:45) [10]


> но какое это имее отношение к списку кодировок установленных
> в системе

самое прямое.
она выводит установленные или поддерживаемые (в зависимости от параметра) в системе кодовые страницы.


> тем более к возможности перекодирования html-файлов?

понятия не имею - я лично что-нить про это говорил?


 
Sergey Kaminski ©   (2004-09-14 20:51) [11]

Суслик ©   (14.09.04 20:40) [9]

Сорри, невнимательно прочитал. С этим нюансом тоже сталкивался.


 
Verg ©   (2004-09-14 20:56) [12]

А я вот сталкивался с тем, что вне зависимости от результата возвращаемого  EnumCodePagesProc callback function енумерация не прекращается.


 
leonidus   (2004-09-15 08:58) [13]

Мастера, я вижу вы сталкивались с фуекцией EnumCodePagesProc - очень прошу, киньте маленький примерчик, жутко туплю я с этими обратными вызовами.


 
Verg ©   (2004-09-15 09:27) [14]

function  EnumCodePagesProc(lpCodePageString : pchar ):DWORD; stdcall;
begin
 Form1.ListBox1.Items.Add(lpCodePageString);
 result := 1;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 if not EnumSystemCodePages(@EnumCodePagesProc, CP_INSTALLED )  then
   ShowMessage("EnumSystemCodePages Error: "+SysErrorMessage(GetLastError));
end;


 
leonidus   (2004-09-15 10:50) [15]

Verg - номера кодовых страниц установленных на данном компьютере получил - большое спасибо, но мне же нужна сама кодовая страница для каждой кодировки, потому что потом необходимо будет перекодировать html-документы. Как теперь быть?


 
Суслик ©   (2004-09-15 10:57) [16]


>  [15] leonidus   (15.09.04 10:50)

Может я не очень понимаю, что тебе нужно, но как я думаю тебе бы помогла функция MultiByteToWideChar. С помощью нее можно перекодировать символ из любой кодировки с помощью любой (установленной) кодовой страницы в unicode символ.
var
  kWC: WideChar;
  kS: String;
begin
  kS := Edit1.Text;
  MultiByteToWideChar(1251{номер кодировки}, 0, @kS[1], 1,  @kWC, 1);
end;


 
leonidus   (2004-09-15 11:01) [17]

поясню еще раз, надо написать процедуру, которой передаем строку из html-документа в какой-то кодировке (будем считать что эта кодировка на компе установлена) и на выходе процедуры надо получить туже строку но перекодированную в другую установленную на данном компе кодировку. Если это KOI8 > Windows 1251 понятно как сделать, а если например Турецкая (ISO) в Турецкую (Windows) совсем не понятно.


 
Суслик ©   (2004-09-15 11:07) [18]

тогда, думаю, тебе надо воспользоваться двумя функциями

1) multibytetowidechar - для перевода строки в исходной кодировке в unicode
2) widechartomultibyte - для перевода получившегося на шаге 1) unicode в строку в нужной кодировке.

Как пользоваться multibytetowidechar я выше показал.
На каждой из этих функций нажми f1 - справка дельфи о них неплохо рассказвает. Если нужно больше информации см здесь msdn.microsoft.com


 
leonidus   (2004-09-15 13:03) [19]

Суслик, беру ваш алгоритм, делаю:

str:tstringlist;
s:array[1..200] of integer;

begin
str:=tstringlist.Create;
str.LoadFromFile("autoname.htm");
kS:=str[0];//читаем первую строку из файла
str.Free;
for i:=1 to length(kS) do
 begin
  s[i]:=MultiByteToWideChar(1251, 0, @kS[i], i,  @kWC, length(kS));
 end;
получаю массив s совершенно не понятного содержания, тут же возникли подозрения что в MultiByteToWideChar передал параметры не верно...


 
Cobalt ©   (2004-09-15 21:49) [20]

2 leonidus   (15.09.04 13:03) [19]
Скажи пожалуйста, откуда ты взял этот кусок кода?


 
leonidus   (2004-09-16 08:50) [21]

как откуда взял, из [16], и несколько переработал, после чего зародилось сомнение, в правильности переработки...


 
leonidus   (2004-09-16 20:55) [22]

что же я делаю не так?


 
Cobalt ©   (2004-09-17 01:01) [23]

2 leonidus   (16.09.04 20:55) [22]
> что же я делаю не так?
Ты забыл прочитать справку по используемой тобой функции!

Всё-таки, не надо тупо копировать код - от этого ничего хорошего не получается - сам видишь!


 
leonidus   (2004-09-17 08:39) [24]

int MultiByteToWideChar(
   UINT CodePage, // code page
   DWORD dwFlags, // character-type options
   LPCSTR lpMultiByteStr, // address of string to map
   int cchMultiByte, // number of characters in string
   LPWSTR lpWideCharStr,// address of wide-character buffer
   int cchWideChar  // size of buffer
  );

CodePage - номер кодовой страницы (я так понял это номер кодовой страницы того символа который мы будем конвертить в юникод)
lpMultiByteStr - указатель на исходную строку
cchMultiByte - длина строки
lpWideCharStr - адрес выходной строки
cchWideChar - размер буфера под выходную строку

тогда делаю так:
kS := Edit1.Text;
MultiByteToWideChar(1251, 0, @kS, length(ks),  @kWC, 1);
edit2.Text:=kWC;

Т.е. я так понял, что kS это входная строка в кодировке 1251, kWC будет выходная строка в кодировке unicod но почему же она длиной 1?
в edit1 ввожу "привет" в edit2 выводится один символ "ь", если размер буфера увеличиваю до двух - появляется ошибка. Где же грабли?


 
leonidus   (2004-09-17 09:42) [25]

мастера, ну подскажите плиз, ОЧЕНЬ надо!!!


 
leonidus   (2004-09-17 13:09) [26]

сделал так:

kS := Edit1.Text;
for i:=1 to length(kS) do
begin
 st:=kS[i];
 MultiByteToWideChar(1251, 0, @st, 1,  @kWC, 1);
 listbox1.Items.Add(kWC);
end;

теперь вроде работает


 
leonidus   (2004-09-17 14:05) [27]

продолжаю эксперименты, хочу перекодировать строку KOI8 в Windows1251

kS := Edit1.Text;
for i:=1 to length(kS) do
begin
 st:=kS[i];
 MultiByteToWideChar(866, 0, @st, 1,  @kWC, 1);
 WideCharToMultiByte(1251, 0, @kWC, 1, @st, 1,  nil, nil);
 listbox1.Items.Add(st);
end;

а в результате преобзазование не происходит - на выходе таже строка что и на входе


 
leonidus   (2004-09-17 14:45) [28]

и так, если кому интересно вот работающий код

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

function WideStringToStringEx(const WS: WideString; CodePage: Word): string;
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, PChar(Result), OutputLength, nil, nil);
end;

edit2.text:=WideStringToStringEx(StringToWideStringEx(edit1.text, 20866), 1251);


 
суслик ©   (2004-09-17 14:47) [29]

какую ты строку передаешь?
из какиз символов?


 
суслик ©   (2004-09-17 14:48) [30]

ты наверное английские символы переводил - они и не должны меняться.
поробуй русские. твой код нормально работает.


 
leonidus   (2004-09-17 14:55) [31]

[28] - это окончателно работающий вариант
а теперь другой момент, с помошью кода  [14] я получаю номера всех кодировок установленных на компе, а как для юзера отобразить название кодирововк а не только ее номер (сажем 20866 это KOI8)?


 
Суслик ©   (2004-09-17 15:01) [32]


>  [31] leonidus   (17.09.04 14:55)


> [28] - это окончателно работающий вариант

Этттта, твой вариант с циклом работал не хуже :)))


> а теперь другой момент, с помошью кода  [14] я получаю номера
> всех кодировок установленных на компе, а как для юзера отобразить
> название кодирововк а не только ее номер (сажем 20866 это
> KOI8)?

Скажу честно, как вытянуть это из системы не знаю - не разбирался.

Но как выход могу предложить скопировать из MSDN таблицу с номерами и названиями и при отображении пользователю зная номер кодировки находить имя кодировки.

Наверняка можно проще - не знаю.


 
leonidus   (2004-09-17 15:10) [33]

ну в принципе можно конечно и таблицу, если ничего другого не останется, вы не видели такую таблицу в MSDN, а то поиск по "code page" ничего не дал


 
Суслик ©   (2004-09-17 15:16) [34]


> [33] leonidus   (17.09.04 15:10)
> ну в принципе можно конечно и таблицу, если ничего другого
> не останется, вы не видели такую таблицу в MSDN, а то поиск
> по "code page" ничего не дал


пока не научишься читать то, что тебе указали не сможешь развиваться :)))
вот ссылка из раздела, который я тебе в ответе [1] указал :))))))

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/unicode_81rn.asp


 
Суслик ©   (2004-09-17 15:18) [35]

поищи в указанном разделе - может там и есть нужная тебе функция, которая по идентфикатору кодовой страницы давала ее имя.


 
leonidus   (2004-09-21 13:23) [36]

да искал, нет там ничего. может ктонибудь сьалкивался?


 
Суслик ©   (2004-09-21 13:50) [37]


> [36] leonidus   (21.09.04 13:23)

готовый списко кодировок из [34] тебе чем не подходит?
занести таблицу к себе в прогу дело пяти минут :)


 
leonidus   (2004-09-22 10:45) [38]

но там же не все кодировки


 
Суслик ©   (2004-09-22 10:55) [39]


> но там же не все кодировки

ищи в сети
т.к. кодировки стандартизированы, то они должны быть описаны в стандартах.
Я не знаю кто их стандратизирует (iso кажется или еще кто-то), но это должна быть общедоступная информация.

может это поможет ftp://dkuug.dk/i18n/

там до фига кодировок.


 
leonidus   (2004-09-22 11:24) [40]

вот что я нарыл: http://wdh.suncloud.ru/default.htm?charsets.htm если кому-то интересно станет



Страницы: 1 2 вся ветка

Текущий архив: 2004.10.24;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.099 c
4-1095408289
gs
2004-09-17 12:04
2004.10.24
Данные системы


14-1097075502
appendix
2004-10-06 19:11
2004.10.24
Hook на клавиатуру


3-1095945571
Koala
2004-09-23 17:19
2004.10.24
Перехват ошибки


6-1092728369
jek_
2004-08-17 11:39
2004.10.24
Почтовая программа


6-1092112346
r9000
2004-08-10 08:32
2004.10.24
Помогите, пожалуйста с Web-сервером