То, что вы считаете текстом файла, на самом деле не текст файла.То, что вы прочитали в строковую переменную, является точным.У вас есть текстовый файл Unicode, закодированный как little-endian UTF-16.Первые два байта представляют метку порядка байтов, и каждая пара байтов после этого является другим символом строки.
Если вы читаете файл Unicode, вы должны использовать тип данных Unicode, напримерWideString
.При установке длины строки вы захотите разделить размер файла на два, и вы захотите отбросить первые два байта.
Если вы не знаете, какой тип файла вы используетепосле чтения вам нужно сначала прочитать первые два или три байта.Если первые два байта являются $ ff $ fe, как указано выше, то у вас может быть файл UTF-16 с прямым порядком байтов;прочитайте оставшуюся часть файла в WideString
или UnicodeString
, если у вас есть этот тип.Если они $ fe $ ff, то это может быть big-endian;прочитайте оставшуюся часть файла в WideString
и затем поменяйте местами порядок каждой пары байтов.Если первые два байта равны $ ef $ bb, проверьте третий байт.Если это $ bf, то это, вероятно, знак порядка байтов UTF-8.Откажитесь от всех трех и прочитайте оставшуюся часть файла в AnsiString
или массив байтов, а затем используйте функцию, такую как UTF8Decode
, чтобы преобразовать ее в WideString
.
Как только вы получите свои данныев WideString
отладчик покажет, что он содержит version
, и у вас не должно возникнуть проблем с использованием Unicode-версии StringReplace
для замены.