|
<< Нажмите, чтобы показать Содержание >> Преобразование Юникода (Unicode) |
Различные функции для работы с Юникодом.
Модуль [VCL / FMX] RVUni / fmxRVUni.
type
TRVCodePage = type cardinal; // defined in RVStyle unit
function RVU_AnsiToUnicode(CodePage: TRVCodePage;
const s: TRVAnsiString): TRVUnicodeString;
function RVU_UnicodeToAnsi(CodePage: TRVCodePage;
const s: TRVUnicodeString): TRVAnsiString;
function RVU_AnsiToUTF8(CodePage: TRVCodePage;
const s: TRVAnsiString): TRVRawByteString;
RVU_AnsiToUnicode преобразует ANSI-строку в указанной кодовой странице (CodePage) в юникодную строку (UTF-16).
RVU_UnicodeToAnsi преобразует юникодную строку (UTF-16) в ANSI-строку в указанной кодовой странице.
RVU_AnsiToUTF8 преобразует ANSI-строку в указанной кодовой странице в строку UTF-8.
type
TRVUnicodeTestResult = (rvutNo, rvutYes, rvutProbably, rvutEmpty,
rvutError);
function RV_TestStreamUnicode(Stream: TStream): TRVUnicodeTestResult;
function RV_TestFileUnicode(
const FileName: String): TRVUnicodeTestResult;
function RV_TestStringUnicode(
const s: TRVRawByteString): TRVUnicodeTestResult;
Эти функции выполняют очень простую проверку содержимого потока, файла или строки, чтобы определить, содержит ли оно текст в Юникоде (UTF-16) или ANSI.
Возможные результаты:
▪rvutNo – текст в ANSI;
▪rvutYes – скорее всего, текст в Юникоде;
▪rvutProbably – текст может быть как в ANSI, так и в Юникоде;
▪rvutEmpty – содержимое пусто;
▪rvutError – ошибка при чтении файла или потока.
Сначала функции проверяют количество байтов в содержимом. Если оно нечётное, текст не является Юникодом (rvutNo).
Затем проверяются первые 2 байта текста. Если они содержат маркер порядка байтов Юникодов (BOM), текст с очень высокой вероятностью является юникодным (rvutYes).
После этого проверяется наличие нулевых байтов среди первых 500 байтов. Если они есть, текст считается не-ANSI (rvutYes); если нет, текст может быть как ANSI, так и Юникодным (rvutProbably).
Для более сложной проверки можно также использовать функцию WinAPI IsTextUnicode.
См. также: