Подтвердить что ты не робот

Delphi2010: Написание кода для назначения Caption, содержащего литеральные значения Unicode или загрузки символов Unicode из текстового файла?

Как сделать программу Unicode в Delphi 2010?

У меня есть английская Windows и "Текущий язык для программ, отличных от Юникода", также является английским. Статические элементы управления выглядят хорошо, но если я попытаюсь их изменить (Label.Caption: = 'unicode value' или Memo.LoadFromFile(textFilename)), текст выглядит так: $^ $&% * (# & #.

Как это исправить?

4b9b3361

Ответ 1

Добро пожаловать в StackOverflow. Пожалуйста, разместите свой код, когда у вас возникнет такая проблема. Я объясню наиболее вероятные источники проблемы, как тот, который вы видите, но я не могу помочь вам исправить это, если вы не публикуете свой код. Также я должен сделать много предположений, потому что вы попросили меня угадать почти все о вашем вопросе, поэтому он закрылся. Надеюсь, вы дадите больше подробностей в будущем, и мы можем избежать закрытых вопросов.

Позвольте мне предположить множество вещей, потому что вы не дали мне очень много данных для продолжения.

  • Вы использовали Delphi раньше, и знаете об основных именах типов, таких как String, Char и т.д.

  • Возможно, вы не знаете различий Unicode между Delphi 2007 (char= Ansichar/string = Ansistring) и Delphi 2009-or-later (включая Delphi 2010 и XE), где Char= UnicodeChar, и String = UnicodeString.

  • Наиболее распространенная причина, по которой вы видите мусор (представленный в вашем вопросе как the text looks like $^$&%*(#&#."), заключается в том, что вы пытались напрямую манипулировать данными AnsiCharacter по размеру байтов и вносить неверный оборот в UnicodeString.

  • MJN также заметил, что из одного из ваших комментариев у вас также возникли проблемы с исходным кодом, который содержит символы Unicode, которые не были сохранены в виде файла UTF8... Когда я пытаюсь поместить символы Unicode в исходный файл Delphi автоматически задает мне этот вопрос, который, как я полагаю, вы также видите, и правильно отвечаете (правильный ответ - да)... Но ваш вопрос не упоминает об этом вообще, вы действительно должны попытаться обновить свой вопрос, указав источник вашей проблемы.

enter image description here

Вот меню формата правой кнопки мыши, из которого вы можете изменить кодировку в любое время, рекомендуемое значение - UTF8, как показано ниже:

enter image description here

Вы должны обязательно опубликовать затронутый код, который генерирует неправильные строковые значения. Вы должны начать, а не с гигантского приложения, которое вы пытаетесь перенести в Unicode Delphi (что является четвертым и самым большим предположением, которое я здесь делаю), а скорее начните с небольшого примера кода.

вот пример "плохо написанного кода", который все еще работает в Delphi 7, потому что каждый символ имеет размер по одному байту, но это предположение не перемещается вверх до 2009 года и XE Delphi:

procedure Tform1.TestBad;
var
 x:PAnsiChar;
 s:String;
begin
  x := 'test';
  s := Copy(PChar(x),1,10);
  Self.Caption := s;
end;

здесь тот же надуманный образец кода "исправлен" (более похожий на не умышленно сломанный), поэтому он, по крайней мере, будет работать в delphi XE:

procedure Tform1.TestLessBad;
var
 x:PAnsiChar;
 s:String;
begin
  x := 'test';
  s := Copy(x,1,10);
  Self.Caption := s;
end;

Использование указателей выше надуманно и ненужно, за исключением того, что я пытаюсь научить этому примеру.

Первый пример создаст символы юникода в заголовке формы вместо того, чтобы показывать текст "test", потому что 2 байта стали единственным символом, потому что я намеренно сделал что-то BAD, чтобы показать вам один простой способ сгенерировать это шум, о котором вы говорите, делая ошибки в моем коде.

Если у вас возникли проблемы с конкретными кодовыми точками юникода, позвольте мне предложить вам попробовать эту нотацию:

c := Char($21CC);  // this is U+21CC (cool two arrows thingy used in chemistry to indicate a reversible reaction)

В качестве альтернативы вы увидите это, что почти то же самое:

c := #$21CC; // U+21CC

Обратите внимание, что вам не нужен кодированный UTF8 файл для хранения файлов, которые вы пишете таким образом.

Ответ 2

Комментарии

Почему Unicode Delphi сохраняет не UTF-8?

и

Delphi 2010 сохранил проект не в UTF-8, я перешел на UTF-8 и все начали работать

похоже, связаны с кодировкой файлов исходного кода проекта (dpr и/или pas) Delphi. Если они установлены в ANSI, например, символы, которые не относятся к текущей кодовой странице, могут быть сохранены некорректно.

IDE (по крайней мере, в Delphi 2009) создает новые единицы с файловым форматом, установленным в ANSI. Для исходного кода смешанного языка UTF-8 (или один из вариантов UCS) необходимо активировать вручную, используя контекстное меню в текстовом редакторе (Формат файла | UTF8).

В среде IDE (в Delphi 2009) также нет возможности установить текстовый формат по умолчанию для чего-то другого, кроме ANSI. (См. Как установить формат файла по умолчанию в Delphi IDE на UTF8?)


Короткий ответ:

Установите формат файла для вашего исходного кода в UTF-8.

(В Delphi 2009 IDE не используется Unicode по умолчанию, я думаю, это все равно то же самое в Delphi 2010)

Ответ 3

Если вы перенесли проект из старой версии Delphi, проверьте шрифт, используемый в ваших диалогах. Не все шрифты поддерживают все символы юникода.

У меня была проблема, которая, по-видимому, была похожа на вашу: у меня были правильные строки unicode в отладчике, но в приложении некоторые специальные символы появились как черные квадраты. Это было с старой программой, перенесенной из Delphi 6, где некоторые титры, где установлен код. На новых формах все было в порядке (здесь титры были установлены в редакторе диалоговых окон, но на самом деле это не актуально).

Проблема была шрифтом всех перенесенных форм. Delphi 6 использовал шрифт MS Sans Serif. Но в этом шрифте отсутствует большинство символов юникода. Переключение на "Тахома" решило мою проблему.