Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Unicode Polskie znaczki

149 views
Skip to first unread message

grizley

unread,
Sep 23, 2008, 4:01:28 PM9/23/08
to
Pobieram dane z pewnego zródła , które nastepnie trzymam w
TStringStream,

oout := TStringStream.create;

nastepnie przekazuje te dane do listbox
ListBox1.Items.Text := oout.DataString;
i w tym miejscu zaczynają sie schody co zrobić aby
po tych operacjach listbox1 wyswietlał polskie znaki?
gdyz pokazuje zamiast polskich znaków jakies krzaczki?

zapisalem jako plik txt i otwarlem w firefoxie
tez pokazywal krzaki ale drobna korekta wyświetlania
na unicode utf8 i juz jest dobrze . A jak zrobic to w delphi zeby w
listbox wyswietlały sie poskie znaki ?

b0bik

unread,
Sep 24, 2008, 2:18:10 AM9/24/08
to
Przy wciskaniu do stream'a lub gdzieś indziej po drodze, zrób
UTF8ToAnsi (jeśli oczywiście dobrze Cię zrozumiałem że dane masz w
UTF8).

b

krzysztof posłuszny

unread,
Sep 24, 2008, 2:20:58 AM9/24/08
to

U�ytkownik "grizley" napisa� w wiadomo�ci
Pobieram dane z pewnego zr�d�a , kt�re nastepnie trzymam w
TStringStream,

oout := TStringStream.create;

nastepnie przekazuje te dane do listbox
ListBox1.Items.Text := oout.DataString;

i w tym miejscu zaczynajďż˝ sie schody co zrobiďż˝ aby
po tych operacjach listbox1 wyswietlaďż˝ polskie znaki?
gdyz pokazuje zamiast polskich znak�w jakies krzaczki?

zapisalem jako plik txt i otwarlem w firefoxie

tez pokazywal krzaki ale drobna korekta wy�wietlania


na unicode utf8 i juz jest dobrze . A jak zrobic to w delphi zeby w

listbox wyswietla�y sie poskie znaki ?

Moze warto by�oby odwiedzi� np. t� stron�:
http://www.eioba.pl/a52/jak_wlaczyc_polskie_znaki_w_delphi

--
kp

grizley

unread,
Sep 24, 2008, 4:54:14 AM9/24/08
to
On 24 Wrz, 08:20, krzysztof posłuszny <krzysiu...@vp.pl> wrote:
> Użytkownik "grizley"  napisał w wiadomości
> Pobieram dane z pewnego zródła , które nastepnie trzymam w

> TStringStream,
>
> oout := TStringStream.create;
>
> nastepnie przekazuje te dane do listbox
> ListBox1.Items.Text := oout.DataString;
> i w tym miejscu zaczynają sie schody  co zrobić aby
> po tych operacjach listbox1 wyswietlał polskie znaki?
> gdyz pokazuje zamiast polskich znaków jakies krzaczki?

>
> zapisalem jako plik txt i otwarlem w firefoxie
> tez pokazywal krzaki ale drobna korekta wyświetlania

> na unicode utf8 i juz jest dobrze . A jak zrobic to w delphi zeby w
> listbox wyswietlały sie poskie znaki ?
>
> Moze warto byłoby odwiedzić np. tą stronę:http://www.eioba.pl/a52/jak_wlaczyc_polskie_znaki_w_delphi

nie no normalnie mam w całym srodkowisku polskie znaki , jak wpisze
recznie np do listbox
ł,ą ćżź to nie ma problemu , problem wystepuje tylko gdy kopiuje z
zewnętrznego źródła jak opisalem wyzej.
Spróbuje zrobić jak napisal bobik

edit:
widze ze Utf8ToAnsi działa swietnie
dzieki :) wam

Piotr Rezmer

unread,
Sep 24, 2008, 12:58:33 PM9/24/08
to
grizley pisze:

> edit:
> widze ze Utf8ToAnsi dzia�a swietnie

Sp�jrz na m�j w�tek poni�ej "UTF8ToAnsi Problem na W2003". Nie jest to
idealna funkcja.


--
pozdrawiam
Piotr
XLR250&bmw_f650_dakar

b0bik

unread,
Sep 25, 2008, 2:26:41 AM9/25/08
to
> Sp jrz na m j w tek poni ej "UTF8ToAnsi Problem na W2003". Nie jest to
> idealna funkcja.


Funkcja jest perfekcyjna, i działa zawsze i wszędzie zgodnie z tym jak
jest zaimplementowana. Trzeba wiedzieć tylko co owe Ansi oznacza w
nazie funckji.

b

Piotr Rezmer

unread,
Sep 25, 2008, 2:52:07 AM9/25/08
to
b0bik pisze:

> Funkcja jest perfekcyjna, i działa zawsze i wszędzie zgodnie z tym jak
> jest zaimplementowana. Trzeba wiedzieć tylko co owe Ansi oznacza w
> nazie funckji.
>

Wolałbym aby funkcja miała jeszcze jeden parametr - kodowanie

--
pozdrawiam
Piotr
XLR250&bmw_f650_dakar

b0bik

unread,
Sep 25, 2008, 4:27:06 AM9/25/08
to
> Wolałbym aby funkcja miała jeszcze jeden parametr - kodowanie

Ta funkcja nie ma tego parametru - jakby miała, to by były pytania co
tam podać. Zamiast tego zobacz sobie jak ona jest zaimplementowana - a
rozwiązanie będzie jak na dłowni. Zamień sobie UTF8 na WideString'a a
potem przejdź na String'a używając MultiByteToWideChar - tam masz
parametr od kodowania.

Akurat mam pod ręką rozwiązanie z JclUnicode.pas:

function UTF8ToWideString(S: AnsiString): WideString;

var
L, J, T: Cardinal;
Ch: UCS4;
ExtraBytesToWrite: Word;

begin
if Length(S) = 0 then
Result := ''
else
begin
SetLength(Result, Length(S)); // create enough room

L := 1;
T := 1;
while L <= Cardinal(Length(S)) do
begin
Ch := 0;
ExtraBytesToWrite := BytesFromUTF8[Ord(S[L])];

for J := ExtraBytesToWrite downto 1 do
begin
Ch := Ch + Ord(S[L]);
Inc(L);
Ch := Ch shl 6;
end;
Ch := Ch + Ord(S[L]);
Inc(L);
Ch := Ch - OffsetsFromUTF8[ExtraBytesToWrite];

if Ch <= MaximumUCS2 then
begin
Result[T] := WideChar(Ch);
Inc(T);
end
else
if Ch > MaximumUCS4 then
begin
Result[T] := WideChar(ReplacementCharacter);
Inc(T);
end
else
begin
Ch := Ch - HalfBase;
Result[T] := WideChar((Ch shr HalfShift) +
SurrogateHighStart);
Inc(T);
Result[T] := WideChar((Ch and HalfMask) +
SurrogateLowStart);
Inc(T);
end;
end;
SetLength(Result, T - 1); // now fix up length
end;
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;


I tak ogólnie polecam lekturę JclUnicode ...

Pozdrawiam
b

wloochacz

unread,
Sep 25, 2008, 7:33:09 AM9/25/08
to
b0bik pisze:

>> Wolałbym aby funkcja miała jeszcze jeden parametr - kodowanie
>
> Ta funkcja nie ma tego parametru - jakby miała, to by były pytania co
> tam podać. Zamiast tego zobacz sobie jak ona jest zaimplementowana - a
> rozwiązanie będzie jak na dłowni. Zamień sobie UTF8 na WideString'a a
> potem przejdź na String'a używając MultiByteToWideChar - tam masz
> parametr od kodowania.
[ciach]
Sratatata; ten parametr "kodowanie" ma się tak:
CP_ACP ANSI code page
CP_MACCP Not supported
CP_OEMCP OEM code page
CP_SYMBOL Not supported
CP_THREAD_ACP Not supported
CP_UTF7 UTF-7 code page
CP_UTF8 UTF-8 code page

Gdzie ANSI jest przyspawane do systemu.
Dziękuję, postoję.
Co ciekawe, jest odpowiednia funkcja w PHP i tam parametr "kodowanie"
jest tym co byśmy chcieli, żeby był.

--
wloochacz

b0bik

unread,
Sep 25, 2008, 7:36:53 AM9/25/08
to

> Sratatata; ten parametr "kodowanie" ma się tak:


Sratatata po dwakroć:

http://msdn.microsoft.com/en-us/library/ms776446(VS.85).aspx

b

wloochacz

unread,
Sep 25, 2008, 8:12:54 AM9/25/08
to
b0bik pisze:

>> Sratatata; ten parametr "kodowanie" ma się tak:
>
>
> Sratatata po dwakroć:
>
> http://msdn.microsoft.com/en-us/library/ms776446(VS.85).aspx
Cudnie, ale to NIE są parametry funkcji MultiByteToWideChar, tylko
identyfikatory stron kodowych w windozie.

Tam jest ładne CP_ACP, które to:
"The current system Windows ANSI code page. This value can be different
on different computers, even on the same network. It can be changed on
the same computer, leading to stored data becoming irrecoverably
corrupted. This value is only intended for temporary use and permanent
storage should be done using UTF-16 or UTF-8 if possible."

Wiesz co znaczy "current system Windows ANSI code page"?

--
wloochacz

b0bik

unread,
Sep 25, 2008, 8:29:53 AM9/25/08
to
On 25 Wrz, 14:12, wloochacz <nospam.wlooch...@nospam.dgbit.pl> wrote:
> Cudnie, ale to NIE s± parametry funkcji MultiByteToWideChar, tylko

> identyfikatory stron kodowych w windozie.

1. A czy ja napisałem że to parametry MBTWC ?

>
> Tam jest ³adne CP_ACP, które to:


> "The current system Windows ANSI code page. This value can be different
> on different computers, even on the same network. It can be changed on
> the same computer, leading to stored data becoming irrecoverably
> corrupted. This value is only intended for temporary use and permanent
> storage should be done using UTF-16 or UTF-8 if possible."
>
> Wiesz co znaczy "current system Windows ANSI code page"?
>

2. I właśnie cały problem rozbija się o to żeby zrozumieć że ANSI jest
związane z systemem (a konkretnie z jego ustawioną wersja językową).
Toteż oczekiwanie że na jakieś Windzie EN, funkcje zawierające w
nazwie Ansi zwrócą poprawnie polskie (ukraiński, rosyjskie, ...) znaki
jest błędem.

Poczytaj sobie helpa do funckji WCTMB:

...
CodePage

Specifies the code page used to perform the conversion. This parameter
can be given the value of any codepage that is installed or available
in the system.
...


b

Noe Bat

unread,
Sep 25, 2008, 11:45:27 AM9/25/08
to

Użytkownik "wloochacz" <nospam.w...@nospam.dgbit.pl>

Tu też jest. To wcale nie muszą być podane przez Ciebie stałe. Może być kod dowolnego języka.

b0bik

unread,
Sep 25, 2008, 12:31:29 PM9/25/08
to
Noe Bat napisał(a):

> Tu te� jest. To wcale nie musz� by� podane przez Ciebie sta�e. Mo�e by� kod dowolnego j�zyka.

No wreszcie ktoś coś konkretnego powiedział, a już myślałem ze monopol
na racje ma tylko jedna osoba.

wloochacz pisze:

> Dziękuję, postoję.

Ciekawe co na to Pan wloochacz ... dalej będzie stał przy swoich 6
stałych, z których połowa jest not supported ?

b

Tocbac

unread,
Sep 25, 2008, 1:10:42 PM9/25/08
to

Użytkownik "Noe Bat" <noe...@op.pl> napisał w wiadomości
news:gbgbmr$9hl$1...@achot.icm.edu.pl...

Użytkownik "wloochacz" <nospam.w...@nospam.dgbit.pl>

--------------

No właśnie. Np. ja chcąc konwertować unicode (nie UTF) <--> "vietnamese"
podaję codepage = 1258
Nic do tego ustawienie systemu.
Oczywiście wyniku nie mogę wyświetlić np. w RichEdit przy innym ustawieniu
niż "vietnamese". Ale to nie wina funkcji konwertującej. String jest tylko
stringiem
w pamięci to ciąg bajtów. Dowcip polega na interpretowaniu takiego ciągu.
Prawdę mówiąc to nawet nie muszę zmienić ustawienia. Mam dane ANSI kodowane
w A. Wyświetlam w RichEdit użyciem Arial i są krzaczki. Zainstaluję czcionkę
B
produktowaną przez ludzi tam, gdzie używają kodowania A --> wybieram dla
RichEdit czcionkę B i mam ładny tekst w RichEdit. Dlaczego? Otoż kiedy mam
Arial
to przecież nie wiadomo (bo skąd?) w jakim kodowaniu są moje dane i jedyne
co rozsądne jest
wybranie ustawienia systemu czyli w moim przypadku 'Polski" a to nie jest
zgodne z
danymi kodowanymi w A. Kiedy wybieram czcionkę B która jest projektowana
specjalnie do obsługi kodowania A to wyświetlenie musi być dobre bo zgodne
z kodowaniem danych.
Dane to dane ale kiedy dojdzie do wyświetlenia to już sprawa czcionki.
Przykład?
Są takie dane że żadne ustawienie systemu nie pomoże bo przy dodawaniu
języka
do systemu zainstalowane dodatkowo czcionki nie potrafią wyświetlić danych.
Dopiero
po zainstalowaniu 'Arial Unicode MS' i wybraniu dla wyświetlenia dla tych
samych danych
będziemy mieli poprawny tekst. Jakieś 'noty' czy 'symbole' to przykład, ale
i moje dane
podane wyżej dla przykładu.

Tocbac


Noe Bat

unread,
Sep 25, 2008, 1:13:09 PM9/25/08
to

Użytkownik "Noe Bat" <noe...@op.pl>

> Sratatata; ten parametr "kodowanie" ma się tak:
> CP_ACP ANSI code page
> CP_MACCP Not supported
> CP_OEMCP OEM code page
> CP_SYMBOL Not supported
> CP_THREAD_ACP Not supported
> CP_UTF7 UTF-7 code page
> CP_UTF8 UTF-8 code page
>
> Gdzie ANSI jest przyspawane do systemu.
> Dziękuję, postoję.
> Co ciekawe, jest odpowiednia funkcja w PHP i tam parametr "kodowanie"
> jest tym co byśmy chcieli, żeby był.

Tu też jest. To wcale nie muszą być podane przez Ciebie stałe. Może być kod dowolnego języka.

--
... w sensie kodowania

Jan Drawski

unread,
Sep 25, 2008, 3:41:38 PM9/25/08
to
> zapisalem jako plik txt i otwarlem w firefoxie
> tez pokazywal krzaki ale drobna korekta wyświetlania
> na unicode utf8 i juz jest dobrze . A jak zrobic to w delphi zeby w
> listbox wyswietlały sie poskie znaki ?

Kiedys do czegos kombinowalem z kodowaniem, to co teraz znalazlem daje
ponizej, mam nadzieje ze cos z tego sie przyda:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms,
Dialogs, StdCtrls, JclLocales, ExtCtrls;

type
Tcpinfoex = record
MaxCharSize: UINT; // max length (in bytes) of a char
DefaultChar: array [0..MAX_DEFAULTCHAR - 1] of BYTE; // default
character (MB)
LeadByte: array [0..MAX_LEADBYTES - 1] of BYTE; // lead byte ranges
UnicodeDefaultChar: WCHAR; // default character (Unicode)
CodePage: UINT; // code page id
CodePageName: array [0..MAX_PATH - 1] of CHAR; // code page name
(Unicode)
end;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Button2: TButton;
Memo1: TMemo;
Label1: TLabel;
Panel1: TPanel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
end;

//{$EXTERNALSYM GetCPInfoExW}
function GetCPInfoEx(CodePage: UINT; dwFlags: DWORD; var lpCPInfoEx:
TCPINFOEX): BOOL; stdcall;
function GetCPInfoEx; external kernel32 name 'GetCPInfoExA';
var
Form1: TForm1;
st: TStrings;

implementation

{$R *.dfm}

function MyEncodeString(const S: string; CodePageIn, CodePageOut: Word):
String;
var
InputLength,
OutputLength: Integer;
WS: WideString;
begin
InputLength := Length(S);
OutputLength := MultiByteToWideChar(CodePageIn, 0, PChar(S),
InputLength, nil, 0 );
SetLength(WS, OutputLength);
MultiByteToWideChar(CodePageIn, 0, PChar(S), InputLength,
PWideChar(WS), OutputLength );
InputLength := Length(WS);
OutputLength := WideCharToMultiByte(CodePageOut, 0, PWideChar(WS),

InputLength, nil, 0, nil, nil );
SetLength(Result, OutputLength);

WideCharToMultiByte(CodePageOut, 0, PWideChar(WS), InputLength,

PChar(Result), OutputLength, nil, nil );
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit2.Text := MyEncodeString(Edit1.Text, 28591, 1250);
//'ążźóóóóół' 1250 28591
end;

function EnumCodePagesProc(CodePageString: PChar): Cardinal; stdcall;
var
s, s1: String;
cpi: TCPInfoEx;
begin
s := StrPas(CodePageString);
GetCpInfoEx(StrToInt(Trim(s)), 0, cpi);
s1 := cpi.CodePageName;
Form1.Memo1.Lines.Add(s1); //s + ', ' +
Form1.Label1.Caption := IntToStr(Form1.Memo1.Lines.Count);
Result := 1;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
EnumSystemCodePages(@EnumCodePagesProc, cp_Installed);
end;

end.

wloochacz

unread,
Sep 26, 2008, 3:51:25 AM9/26/08
to
b0bik pisze:
[ciach]

> wloochacz pisze:
>
>> Dziękuję, postoję.
>
> Ciekawe co na to Pan wloochacz ... dalej będzie stał przy swoich 6
> stałych, z których połowa jest not supported ?
Pan wloochacz źle zinterpretował opis z MSDN; ot, co.
Dzięki za naprostowanie.

--
wloochacz

Piotr Rezmer

unread,
Oct 7, 2008, 4:50:04 PM10/7/08
to
Jan Drawski pisze:

> Kiedys do czegos kombinowalem z kodowaniem, to co teraz znalazlem daje
> ponizej, mam nadzieje ze cos z tego sie przyda:
>

Próbowalem dzisiaj użyć podanego przez Ciebie kodu - działa. Jednak jako
całość, aplikacja (w delphi6) działa poprawnie jedynie jeśli ustawię w
"regional settings" language for non-Unicode programs na Polish.
Przy ustawieniu English, dane wejściowe jeszcze przed zrobieniem
konwersji są popsute. Dane są dostarczane przez klasy tidSoapServer.


--
pozdrawiam
Piotr
XLR250&bmw_f650_dakar

0 new messages