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