Почему файлы имеют разный размер?
Потому что они используют разные кодировки. Кодировка 1251 отображает каждый символ в один байт. Но UTF-8 использует переменное количество байтов для каждого символа.
Как получить истинное содержимое файла?
Вам нужно использовать тип строки, который соответствует кодировке, используемой в файле. Так, например, если содержимое закодировано в кодировке UTF-8, что является лучшим выбором, вы загружаете содержимое в строку UTF-8. Вы используете FPC в режиме, где string
имеет кодировку UTF-8. В этом случае код в вопросе - это то, что вам нужно.
Загрузка файла в кодировке MBCS с кодовой страницей 1251, скажем, более сложна. Вы можете загрузить это в переменную AnsiString
, и если языковой стандарт вашей системы равен 1251, любые преобразования будут выполняться правильно.
Но код будет вести себя по-другому при запуске на машине с другой локалью. И если вы хотели загрузить текст с использованием разных кодировок MBCS, например 1252, то вы не можете использовать этот подход. Вам нужно будет загрузить в массив байтов, а затем преобразовать из 1252, скажем, в UTF-8, чтобы затем сохранить этот UTF-8 в переменной string
.
Для этого вы можете использовать модуль LConvEncoding
. из ЛКЛ. Например, вы можете использовать CP1251ToUTF8
, CP1252ToUTF8
и т. д. для преобразования MBCS в UTF-8.
Как я могу определить из файла, какая кодировка используется?
Вы не можете. Вы можете сделать предположение, которое будет точным во многих случаях. Но в общем случае определить кодировку массива байтов, который предназначен для представления текста, просто невозможно.
Иногда можно взять файл и исключить определенные кодировки. Например, не все потоки байтов являются допустимым текстом UTF-8 или UTF-16. И поэтому вы можете исключить такие файлы. Но для таких кодировок, как 1251, 1252 и т. д., допустим любой поток байтов. У вас просто нет возможности отличить 1251 закодированный поток от 1252 закодированного потока со 100% точностью.
Блок LConvEncoding
имеет GuessEncoding
, что звучит так, как будто это какой-то использовать.
person
David Heffernan
schedule
21.05.2013
ShowMessage(AnsiToUTF8(tr));
Подробнее о кодировках читайте здесь: Поддержка LCL Unicode - person Abelisto   schedule 21.05.2013