Czy może ktoś jak przekonwertować polskie znaki kodowane w ucs2 na latin2? Z mazovii robię to bez problemów, ale dla ucs2 nie mogę znaleŹć odpowiedników polskich znaków w ASCII
Przykład odczytuje z pliku Unicode UCS2 Little Endian i pokazuje go najpierw w MessageBox, a potem konwertuje go na Latin-2 i znów pokazuje w MessageBox.
var Handle:THandle;
c:array[0..255] of char;
wc:array[0..255] of widechar;
s:dword;
const CP_LATIN2 = 852;
begin
ZeroMemory(@wc, sizeof(wc));
ZeroMemory(@c, sizeof(c));
Handle:=CreateFile('c:\mix.txt', GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
if (Handle<>INVALID_HANDLE_VALUE) then
begin
s:=GetFileSize(Handle, nil);
ReadFile(Handle, wc, s, s, nil);
CloseHandle(Handle);
MessageBoxW(0, wc, wc, MB_OK);
WideCharToMultiByte(CP_LATIN2, 0, @wc, -1, @c, sizeof(c), nil, nil);
MessageBoxA(0, c, c, MB_OK);
end;
end;
Lista numerów kodowań:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/unicode_81rn.asp
pakiet synapse, moduł synachar i tam masz (hint latin 2 to ISO_8859_2)
Misiekd - gdyby szukał edytora, nie pytałby w dziale Delphi.
Szczawik napisał(a)
Misiekd - gdyby szukał edytora, nie pytałby w dziale Delphi.
ale osso chodzi??
synapse to zbiór unitów do obsługi sieci, a jeden z nich implementuje zamianę kodowania między kilkudziesięcioma systemami...
Spoko, skojarzyłem podobny w nazwie edytor (tak mi się przynajmniej wydaje).
W dodatku, co za herezję szerzysz! Latin2 to nie zupełnie ISO8859-2. Strona kodowa Latin2 to 852 (ISO8859-2:1999), a obecny ISO8859-2 to 28592 (ISO8859-2:2001).
Przykład (zdanie po polsku i koreańskie symbole):
Unicode:
Zażółć gęślą jaźń ㅀㅎㅀ;ㅣㅏㄹㅇㅎ
Latin-2:
?Zaľ˘† g©lĄ ja«ä ???;?????
ISO8895-2:
?Zażółć gę¶l± jaĽń ???;?????
Osoby, które pamiętają przechodzenie z MsDOS na Windows lub bawią się czasem konsolą Windows'a zapewne pamiętają obraz tych wyższych symboli (Latin-2); osoby, które kojarzą polskie strony internetowe zapewne znają współczesne ISO8859-2.
var Handle:THandle;
c:array[0..255] of char;
wc:array[0..255] of widechar;
s:dword;
const CP_LATIN2 = 852;
CP_ISO8895_2 = 28592;
begin
ZeroMemory(@wc, sizeof(wc));
ZeroMemory(@c, sizeof(c));
Handle:=CreateFile('c:\mix.txt', GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
if (Handle<>INVALID_HANDLE_VALUE) then
begin
s:=GetFileSize(Handle, nil);
ReadFile(Handle, wc, s, s, nil);
CloseHandle(Handle);
MessageBoxW(0, wc, wc, MB_OK);
Handle:=CreateFile('c:\mix2.txt', GENERIC_WRITE, 0, nil, CREATE_NEW, 0, 0);
if (Handle<>INVALID_HANDLE_VALUE) then
begin
WideCharToMultiByte(CP_LATIN2, 0, @wc, -1, @c, sizeof(c), nil, nil);
WriteFile(Handle, c, strlen(c), s, nil);
WideCharToMultiByte(CP_ISO8895_2, 0, @wc, -1, @c, sizeof(c), nil, nil);
WriteFile(Handle, c, strlen(c), s, nil);
CloseHandle(Handle);
end;
end;
end;
A tak na boku - Windows sam w sobie ma zaimplementowaną konwersję.
Spoczko, te kody są ok, ale wywala błędem z cpu w tytuje. Gdzieś tu jest błąd a przydałaby mi się wersja nie wywalająca błędów. ;)