Форум: "WinAPI";
Текущий архив: 2004.10.24;
Скачать: [xml.tar.bz2];
ВнизСписок кодировок Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.10.24;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.039 c