Добро пожаловать в StackOverflow.Пожалуйста, оставьте свой код, когда у вас возникла такая проблема.Я объясню наиболее вероятные источники проблемы, например ту, которую вы видите, но я не могу помочь вам решить ее, если вы не разместите свой код.Также я должен сделать много предположений, потому что вы попросили меня угадать почти все по вашему вопросу, поэтому он был закрыт.Я надеюсь, что вы дадите больше подробностей в будущем, и мы можем избежать закрытых вопросов.
Позвольте мне предположить кое-что, потому что вы не дали мне слишком много данных для продолжения.
Вы уже использовали Delphi и знаете имена фундаментальных типов, такие как String, Char и т. Д.
Вы не можетезнать о различиях Unicode между Delphi 2007 (char = Ansichar / string = Ansistring) и Delphi 2009 или более поздней версии (включая Delphi 2010 и XE), где Char = UnicodeChar и String = UnicodeString.
Самая распространенная причина, по которой вы видите мусор (представлен в вашем вопросе как the text looks like $^$&%*(#&#."
), заключается в том, что вы пытались напрямую манипулировать данными AnsiCharacter размером в байт и неверно приводить их в UnicodeString.
MJN также заметил из одного из ваших комментариев, что у вас также возникают проблемы с исходным кодом, который содержит символы Unicode, которые не были сохранены в виде файла UTF8 ... Когда я пытаюсь поставитьСимволы Unicode в исходный файл Delphi автоматически задает мне этот вопрос, который, я полагаю, вы также видите, и отвечаете правильно (правильный ответ - да) ... Но ваш вопрос вообще не упоминает об этом, вам действительно следует попытаться обновитьваш вопрос, чтобы указать источник вашей проблемы.
![enter image description here](https://i.stack.imgur.com/Z7gFc.png)
Здесь вы можете щелкнуть правой кнопкой мыши меню формата файла, из которого вы можете изменить кодировку в любойвремя, рекомендуемое значение UTF8, как показано здесь:
![enter image description here](https://i.stack.imgur.com/X8sVd.png)
Вы должны обязательно опубликовать уязвимый код, который генерирует неправильные строковые значения.Вам следует начать не с гигантского приложения, которое вы пытаетесь перенести на 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 для хранения вещей, которые вы пишете таким образом.