У меня та же проблема, см. Этот код:
const
TheStart=13;
TheEnd=69;
type
TMyFileField: Array[TheStart..TheEnd] of Char; // This is a simplification of a field type on a file
procedure WriteWideStringToArrayOfChars(TheLiteral:WideString);
var
MyFileField:TMyFileField; // This is a simplification, it is really a Field inside a File
MyIndex:Integer;
begin
for MyIndex:=1 to Max(Length(TheLiteral),1+TheEnd-TheStart)
do begin // Will copy as many charactes as possible from TheLiteral to MyFileField
MyFileField[MyIndex]:=Copy(TheLiteral,MyIndex,1)[1]; // This gives Copile Error: Incompatible types 'Char' and 'WideChar'
end;
end;
Проблема в том, что WideString должен быть сохранен в массив Ar Char of Char внутри файла. Таким образом, типы смешивания должны быть выполнены ... и, таким образом, произойдет некоторая потеря символов Unicode, и никак не избежать этого.
Требуется: компилятор может скомпилировать его.
Solution1: конвертировать WideString в String до вызова Copy или внутри Copy.
Решение 2. Преобразуйте WideChar в Char перед заданием.
Вот оба решения (помните, что некоторые символы Юникода могут быть потеряны) ...
Solution1:
MyFileField[MyIndex]:=Copy(UTF8Encode(TheLiteral),MyIndex,1)[1]; // Note: Unicode chars will not get lost, but converted, so beware of accent vocals, etc...
или
MyFileField[MyIndex]:=Copy(String(TheLiteral),MyIndex,1)[1]; // Note: Unicode chars will get lost, they will be converted to '?'
1021 * * Solution2:
MyFileField[MyIndex]:=Char(Copy(TheLiteral,MyIndex,1)[1]); // Note: Unicode chars will get lost, they will be converted to '?'
Если кто-нибудь знает муравейник лучше, я был бы рад узнать.
Я лично использую Copy(String(Literal),Start,NumberOfChars)
, так как нормальные буквы с акцентом сохраняются и, что более важно, длина ...
Пример: длина (строка ('BlaBlaBlá')) -> 9
Пример: длина (UTF8Encode ('BlaBlaBlá')) -> более 9 с момента последнего 'á' преобразуется в несколько символов и т. Д ...
Надеюсь, это кому-нибудь поможет!