Юникод (Unicode) в ТРВ-Редакторе (TRichView)

<< Нажмите, чтобы показать Содержание >>

Юникод (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 (RichView Format)

В новой версии ТРВ-Редактора весь текст сохраняется в RVF в кодировке Юникод.

В старых версиях ТРВ-Редактора часть текста могла быть сохранена в кодировке ANSI. При чтении такой текст будет автоматически конвертирован в Юникод, и значение rvfwConvToUnicode будет добавлено в RVFWarnings.

См. также...

Пример загрузки файлов с текстом в кодировке UTF-8.