Добро пожаловать в 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 автоматически задает мне этот вопрос, который, я полагаю, вы также видите, и отвечаете правильно (правильный ответ - да) ... Но ваш вопрос вообще не упоминает об этом, вам действительно следует попытаться обновитьваш вопрос, чтобы указать источник вашей проблемы.
Здесь вы можете щелкнуть правой кнопкой мыши меню формата файла, из которого вы можете изменить кодировку в любойвремя, рекомендуемое значение UTF8, как показано здесь:
Вы должны обязательно опубликовать уязвимый код, который генерирует неправильные строковые значения.Вам следует начать не с гигантского приложения, которое вы пытаетесь перенести на 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 для хранения вещей, которые вы пишете таким образом.