UNICODE ucs2 na latin2

0

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

0

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

0

pakiet synapse, moduł synachar i tam masz (hint latin 2 to ISO_8859_2)

0

Misiekd - gdyby szukał edytora, nie pytałby w dziale Delphi.

0
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...

0

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ę.

0

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. ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1