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 ?
b
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
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
> 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
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
> 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
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
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
Sratatata po dwakroć:
http://msdn.microsoft.com/en-us/library/ms776446(VS.85).aspx
b
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
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
Tu też jest. To wcale nie muszą być podane przez Ciebie stałe. Może być kod dowolnego języka.
> 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
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
> 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
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
> 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