Вот, попался тут баг один. Вернее, не баг, а подводный камень.
Что не так в этом коде?
var
Text, Data: AnsiString;
begin
// откуда-то получаем данные. Например - от GetWindowTextA
Data := ...;
// Теперь сам код
Text := 'Text ' + Data;
ShowMessage(Text);
end;
Условия: Delphi 2009 или 2010, все настройки по-умолчанию.
Указанный выше код может не работать при некоторых неочевидных условиях. Ваша задача - объяснить почему.
Подзадачка №3.5: как исправить вышеприведённый код, чтобы избавиться от проблемы?
Ответ на задачку будет выложен где-то через месяц.
Добавлено уточнение по комментариям посетителей:
GetACP = 1251, в строке Data лежит текст в 1251. Т.е. мы запускаем программу на винде с "Язык для не unicode программ" = Русский и она работает с русским текстом.
Трансформация из unicode в ANSI и наоборот не являются проблемой в этой задаче (ладно, это очень сильная подсказка, но уж больно вещь не очевидная).
ткну в небо :)
ОтветитьУдалитьShowMessage наверно юникодный в дельфи,
если в Data будет текст не соответвующий текущей локали (или просто неанглийский) то при преобразовании Text в UTFString чего ни будь будет не так.
Да там и 'Text '+Data вроде бы будет через преобразование в юникод происходить. Благодаря чему в переменной Text вполне можно получить знаки вопроса.
ОтветитьУдалитьP.S. В фаерфоксе набирать посты просто невозможно.
Самая первая мысль - это трансформация Анси и Юникода.
ОтветитьУдалитьЗЫ, а что за проблемы в ФФ при набирании поста? Не заметил.
Так, кажется я упустил важное уточнение: GetACP = 1251, в строке Data лежит текст в 1251. Т.е. мы запускаем программу на винде с "Язык для не unicode программ" = Русский и она работает с русским текстом.
ОтветитьУдалитьПри этом в коде всё ещё ЕСТЬ косяк.
В чём он заключается?
Подсказка: трансформация unicode <-> ANSI тут непричём. Если вам мозолит глаза ShowMessage - представьте, что там стоит сохранение строки в файл "как есть" (побайтово).
P.S. Смотреть в отладчике не так прикольно, как попытаться сообразить самому.
Этот комментарий был удален автором.
ОтветитьУдалитьКак я уже сказал, трансформация из unicode в ANSI и наоборот не являются проблемой в этой задаче (ладно, это очень сильная подсказка, но уж больно вещь не очевидная).
ОтветитьУдалитьКста, если сообразите, в чём проблема, то подзадачка №3.5: как исправить вышеприведённый код, чтобы избавиться от проблемы?
ОтветитьУдалитьЯ с этим почти весь день сидел :D
В Text будет значение "Text ", т.е. Data не приконкатенируется. Мучился сам с этим, решил как-то... кажется, что-то типа явного приведения к типу AnsiString.
ОтветитьУдалить