-
рискую нарваться на неприятности, но не знаю где спросить. 1) как UnicodeString преобразовывать в анси? 2) существуют ли функции, работающие с юникодом? Я их не нашёл (UNICODE_CTRLS вкл) 3) в SysUtils есть ф-я, подсчитывающая длину строки в юникоде - ElementToCharLen (вызывает ElementToCharIndex). Я попробовал переделать для КОЛа, но там много связанного друг с другом, не получилось. Есть ли аналог или может быть кто-то конвертировал?..
-
на форме нашёл св-во Unicode, включил. Функции типа Str2DateTimeShort так и остались ансишными. Что понималось под фразой "полностью переведено под Юникод"?
-
1) PAnsiChar(AnsiString хотя чем-то мне это не нравится 2) нашёл AnsiCompareStr, но многих других пока нет 3) ответ нашёл здесь Unicode_Delphi-RUS.pdf Сейчас пишу чтобы работало для любых делфей и окон
-
почему-то {$DEFINE UNICODE_CTRLS} в kol.pas не распространяется на другие модули. Код для Делфи 2009 и выше и Висты и новее, почти содран с одной статьи. Под ХР там ещё что-то нужно делать, а я вряд ли вернусь к ХР и Д7. uses Windows;
function NormalizedStrLen(const S: String): SmallInt;
implementation
const
NormalizationC = 1;
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.
-
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;
var
su:string; sa:AnsiString;
begin
sa:='Test';
su:= su;
sa:= UnicodeToAnsiString(su,1251);
end;
a.2.
program test;
Or better, compiler|options|conditional defines: UNICODE_CTRLS a.3.
var
u,a:integer;
su:string; sa:AnsiString;
begin
sa:='Test';
su:= su; u:=length(su); a:=length(sa);
end;
-
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.
-
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;
-
function UnicodeToAnsiString(const ws: WideString): AnsiString;overload;
begin
Result := UnicodeToAnsiString(ws, GetACP);
end;
-
KOLSocket. Не знаю запрос в Д2009 коверкается или ещё что... Под Д7 всё работало. Помогите пожалуйста разобраться. http://dy.cdrrhq.ru/dnldr.rarв monlog.txt лог сниффера, в page.txt содержимое буфера сокета
-
решилось перекомпиляцией KOLSocket с заменой строк на AnsiString. Кто-н может проверить в юникодовой версии?
|