|
<< Нажмите, чтобы показать Содержание >> Юникод (Unicode) в ТРВ-Редакторе (TRichView) |
Юникод (Unicode) – это универсальный стандарт, который задаёт уникальный номер (код) для каждого символа: букв, цифр, знаков и даже эмодзи. Благодаря этому текст можно одинаково понимать на разных устройствах и в разных странах. Юникод включает в себя в себя знаки почти всех письменных языков мира.
UTF-8 и UTF-16 – это способы хранения (кодирования) символов Юникода в памяти или файлах:
▪UTF-8 использует от 1 до 4 байт на символ. Однобайтные символы UTF-8 совместимы с ANSI. Эта кодировка очень популярна в интернете, потому что экономит место для обычного текста (например, английского). UTF-8 является кодировкой строк (String) в Lazarus.
▪UTF-16 использует 2 байта для основных символов, и 4 байта для дополнительных. Часто применяется внутри программ и систем (например, в Windows). UTF-8 является кодировкой строк (String) в Delphi 2009 и новее, а также строк типов WideString и UnicodeString.
Все строки, хранимые в документе TRichView – юникодные строки (UTF-16). Это справедливо для всех версий Delphi и Lazarus.
Текстовые файлы
LoadText, LoadTextFromStream загружают файлы в указанной кодировке (ANSI или Юникод).
LoadTextW, LoadTextFromStreamW загружают юникодные (UTF-16) файлы.
Note: вы можете протестировать файл функцией
function RV_TestFileUnicode(
const FileName: TRVUnicodeString): TRVUnicodeTestResult
из модуля RVUni.pas.
Возвращаемое значение
▪rvutNo – файл не UTF-16 (нечётный размер);
▪rvutYes – файл, скорее всего, юникодный (UTF-16) (чётный размер, символ-маркер Юникода в начале, или нулевые байты в тексте (проверяются первые 500 байт));
▪rvutProbably – файл может содержать Юникод UTF-16 (чётный размер);
▪rvutEmpty – файл пустой;
▪rvutError – ошибка открытия файла.
В Windows вы также можете использовать функцию WinAPI IsTextUnicode, которая проводит более сложный анализ.
SaveText сохраняет текстовый файл в указанной кодировке.
SaveTextW сохраняет юникодный (UTF-16) текстовый файл.
Файлы RTF (Rich Text Format) и DocX
Файлы RTF и DocX могут содержать юникодный текст.
HTML
Методы сохранения в HTML сохраняют текст в кодировке UTF-8 особенным образом.
В кодировке UTF-8 все символы, не являющиеся управляющими символами HTML-кода, сохраняются как есть.
Если кодировка не UTF-8, юникодные символы сохраняются в виде кодов (&#NNNN;), все символы остаются какими были, но размер файла увеличивается. Поэтому крайне рекомендуется сохранять HTML в формате UTF-8.
При загрузке HTML, TRichView использует либо кодировку, указанную в самом HTML, либо кодировку, указанную в параметре метода загрузки HTML. Текст из HTML конвертируется из этой кодировки в внутреннее представление (то есть в UTF-16).
GetSelTextA возвращает выделенный текст как ANSI-строку. Юникодный текст конвертируется, используя Style.DefCodePage.
GetSelTextW возвращает выделенный текст как юникодную (UTF-16) строку.
Имеются версии методов поиска текста, позволяющие искать строки в формате ANSI и Unicode: TRichView.SearchTextA/SearchTextW; однако SearchTextA просто преобразует строку в Юникод (используя Style.DefCodePage) и вызывает SearchTextW.
CopyTextA копирует выделенный текст в буфер обмена как ANSI (VCL и Lazarus для Windows) Юникодный текст конвертируется, используя Style.DefCodePage.
CopyTextW копирует выделенный текст в буфер обмена как Юникод (UTF-16)
Copy и CopyDef копируют юникодный текст (см rvoAutoCopyUnicodeText в Options).
Paste вставляет юникодный текст из буфера обмена (если он там есть).
PasteTextA вставляет ANSI-текст из буфера обмена (VCL и Lazarus для Windows), PasteTextW вставляет юникодный текст.
InsertTextFromFile: вставляет текст из файла в указанной кодировке.
InsertOEMTextFromFile вставляет текст из файла в кодировке DOS (только в Windows)
InsertTextFromFileW вставляет юникодный текст (UTF-16) из файла.
InsertText, InsertStringTag вставляют юникодную строку (UTF-16 в Delphi/C++Builder 2009+ и UTF-8 в Lazarus) или ANSI-string (в старых версиях Delphi/C++Builder).
InsertTextA, InsertStringATag вставляют ANSI-строку.
InsertTextW, InsertStringWTag вставляют юникодную строку (UTF-16).
В новой версии ТРВ-Редактора весь текст сохраняется в RVF в кодировке Юникод.
В старых версиях ТРВ-Редактора часть текста могла быть сохранена в кодировке ANSI. При чтении такой текст будет автоматически конвертирован в Юникод, и значение rvfwConvToUnicode будет добавлено в RVFWarnings.