Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.054 c
14-1096294909
QuasiLamo
2004-09-27 18:21
2004.10.24
Эксперты для форматирования кода D7


9-1087530602
VolanD
2004-06-18 07:50
2004.10.24
Вращение точки


1-1097236916
Aleksandr.
2004-10-08 16:01
2004.10.24
Имеет ли функция CopyFile проблемы с многопоточностью и проч.?


14-1096614521
Жук
2004-10-01 11:08
2004.10.24
А.Н.Толстой "Пётр Первый"


14-1096805244
Falcon(TFSoft)
2004-10-03 16:07
2004.10.24
Что за технологоия .NET?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский