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

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

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

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

Ответы [ 3 ]

19 голосов
/ 08 июня 2011

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

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

  1. Вы уже использовали Delphi и знаете имена фундаментальных типов, такие как String, Char и т. Д.

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

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

  4. 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;

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

Первый пример создаст юникод китайские символы в заголовке формы вместо отображения текста «тест», потому что 2 байта стали одним символом, потому что я намеренно сделал что-то ПЛОХОчтобы показать вам один простой способ генерировать этот шум, о котором вы говорите, допуская ошибки в моем коде.

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

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

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

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

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

7 голосов
/ 08 июня 2011

Комментарии

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

и

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

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

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

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


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

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

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

0 голосов
/ 17 сентября 2013

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

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

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

...