Конференция "KOL" » Delphi 2009 [D2009, Win7]
 
  • Dy1 (18.03.11 12:09) [0]
    рискую нарваться на неприятности, но не знаю где спросить.
    1) как UnicodeString преобразовывать в анси?
    2) существуют ли функции, работающие с юникодом? Я их не нашёл (UNICODE_CTRLS вкл)
    3) в SysUtils есть ф-я, подсчитывающая длину строки в юникоде - ElementToCharLen (вызывает ElementToCharIndex). Я попробовал переделать для КОЛа, но там много связанного друг с другом, не получилось. Есть ли аналог или может быть кто-то конвертировал?..
  • Dy1 (18.03.11 12:16) [1]
    на форме нашёл св-во Unicode, включил. Функции типа Str2DateTimeShort так и остались ансишными. Что понималось под фразой "полностью переведено под Юникод"?
  • Dy1 (18.03.11 13:22) [2]
    1)  PAnsiChar(AnsiString  хотя чем-то мне это не нравится
    2) нашёл AnsiCompareStr, но многих других пока нет
    3) ответ нашёл здесь  Unicode_Delphi-RUS.pdf  Сейчас пишу чтобы работало для любых делфей и окон
  • Dy1 (18.03.11 16:09) [3]
    почему-то {$DEFINE UNICODE_CTRLS} в kol.pas не распространяется на другие модули.

    Код для Делфи 2009 и выше и Висты и новее, почти содран с одной статьи. Под ХР там ещё что-то нужно делать, а я вряд ли вернусь к ХР и Д7.

    uses Windows;

    function NormalizedStrLen(const S: String): SmallInt;//System.Length возвращает SmallInt

    implementation

    const
    //  NormalizationOther = 0;
     NormalizationC     = 1;
    //  NormalizationD     = 2;
    //  NormalizationKC    = 5;
    //  NormalizationKD    = 6;

    function IsNormalizedString(NormForm: Integer; lpString: LPCWSTR;
     cwLength: Integer): BOOL; stdcall; external 'Normaliz.dll';
    function NormalizeString(NormForm: Integer; lpSrcString: LPCWSTR; cwSrcLength: Integer;
     lpDstString: LPWSTR; cwDstLength: Integer): Integer; stdcall; external 'Normaliz.dll';

    function NormalizedStrLen(const S: String): SmallInt;
    var Buf: String;
    begin
     if not IsNormalizedString(NormalizationC, PChar(S), -1) then
     begin
       SetLength(Buf, NormalizeString(NormalizationC, PChar(S), Length(S), nil, 0));
       Result := NormalizeString(NormalizationC, PChar(S), Length(S), PChar(Buf), Length(Buf));
     end
     else
       Result := Length(S);
    end;
    end.

  • Thaddy © (19.03.11 06:24) [4]
    a.1. You can simply assign a unicode string to ansi string:


    function UnicodeToAnsiString(const ws:string; codePage: Word): AnsiString;
    var
     l: integer;
    begin
     if ws = ' then
       Result := '

     else
     begin
       l := WideCharToMultiByte(codePage,
         WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR,
         @ws[1], - 1, nil, 0, nil, nil);
       SetLength(Result, l - 1);
       if l > 1 then
         WideCharToMultiByte(codePage,
           WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR,
           @ws[1], - 1, @Result[1], l - 1, nil, nil);
     end;
    end;

    //d2009,2010,XE
    var
    su:string;// not downwards portable for Delphi versions < d2009
    sa:AnsiString;
    begin
    //ansi to unicode is automatic:
    sa:='Test';
    su:= su; //compiler will do conversion.
    // but warning generated: implicit conversion unicode to ansi

    // unicode to ansi needs helper function:
    sa:= UnicodeToAnsiString(su,1251{cp russian});

    end;



    a.2.

    program test; //DPR, not in units
    {$DEFINE UNICODE_CTRLS}


    Or better, compiler|options|conditional defines: UNICODE_CTRLS

    a.3.


    //d2009,2010,XE
    var
    u,a:integer;
    su:string;// not downwards portable for Delphi versions < d2009
    sa:AnsiString;
    begin
    sa:='Test';
    su:= su; //compiler will do conversion.
    u:=length(su);// <mile>
    a:=length(sa);

    end;

  • thaddy © (19.03.11 06:28) [5]
    Mm, very sleepy and reversal mistakes:
    What I mean is:
    Ansi to unicode assignment is automatic.
    Unicode to Ansi assignment is not. Use the function to do that.
    (Or similar if you do not use KOL in sysutils and character units)

    If you define UNICODE_CTRLS in compiler options KOLstring = Unicode
    Try to use KOLstring as much as possible for easy portability.
  • thaddy © (19.03.11 06:46) [6]
    simplified overloaded function for U to A, more portable

    uses
     windows,
     kol;

    function UnicodeToAnsiString(const ws: WideString; codePage: Word): AnsiString;
     overload;
    var
     l: integer;
    begin
     if ws = '' then
       Result := ''
     else
     begin
       l := WideCharToMultiByte(codePage,
         WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR,
         @ws[1], -1, nil, 0, nil, nil);
       SetLength(Result, l - 1);
       if l > 1 then
         WideCharToMultiByte(codePage,
           WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR,
           @ws[1], -1, @Result[1], l - 1, nil, nil);
     end;
    end;

    function UnicodeToAnsiString(const ws: WideString; codePage: Word): AnsiString;
     overload;
    begin
     Result := UnicodeToAnsiString(ws, GetACP);
    end;



  • thaddy © (19.03.11 06:48) [7]

    //still sleepy clipboard
    function UnicodeToAnsiString(const ws: WideString): AnsiString;overload;
    begin
    Result := UnicodeToAnsiString(ws, GetACP);
    end;

  • Dy1 (20.03.11 13:31) [8]
    KOLSocket. Не знаю запрос в Д2009 коверкается или ещё что... Под Д7 всё работало. Помогите пожалуйста разобраться.
    http://dy.cdrrhq.ru/dnldr.rar

    в monlog.txt лог сниффера, в page.txt содержимое буфера сокета
  • Dy1 (20.03.11 14:05) [9]
    решилось перекомпиляцией KOLSocket с заменой строк на AnsiString. Кто-н может проверить в юникодовой версии?
 
Конференция "KOL" » Delphi 2009 [D2009, Win7]
Есть новые Нет новых   [120350   +20][b:0][p:0.004]