Как работать с UTF-8

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Dr_Grizzly
Сообщения: 407
Зарегистрирован: 13 сен 2004, 12:05
Откуда: Курган
Контактная информация:

Всем привет! Появилась задача выгружать данные из базы в текстовый файл в формате UTF-8, не соображу какими способами это можно сделать. Есть у кого уже навык работы с этим? Посоветуйте плиз.

Погуглил малость - нашел функцию UTF8Encode() теоретически если записывать в мемо текст используя эту функцию - то после сохранения содержимого мемо в файл - он говорит якобы кодировка utf-8. Одна фигня только - я не вижу что написано в мемо....
Чем проще - тем оригинальней, а значит гениально, т.к. все гениальное - просто! ;) Да! Кстати! Ctrl+V реально вставляет!!! ХDD
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Либо перекодировкой занимайся при которой будет потеря данных, либо использую utf компоненты т.е. дэльфя от 2009 года тебе нужна.
[syntax=Delphi] [/syntax]
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

дык если тебе просто файл записать, зачем смотреть его в мемо? Для старых дельфей есть ТНТ компоненты, но по-моему лучше уж на Д09 и старше переходить...
Изображение
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Можно воспользоваться парой функций:
1) MultiByteToWideChar - преобразуем из "обычного" текста в Unicode
2) WideCharToMultiByte - преобразуем из Unicode в UTF-8 (или вообще в любую другоу кодирову при необходимости)

Более подробно. Сперва MultiByteToWideChar вызываем, указывая параметр cchWideChar (размер буфера-получателя) как ноль. При аком вызове ф-ия возвращает требуемый размер буфера, необходимый для размещения строки результата. Выделяем в памяти буфер нужного размера и делаем повторный вызов уже для преобразования строки.
Другие параметры, передаваемые в ф-ию:
CodePage = 1251 (или 866, если вдруг исходная строка в DOS-кодировке :) )
dwFlags = 0
lpMultiByteStr = указатель на исходную строку
cbMultiByte = длина (в байтах) исходной строки
lpWideCharStr = указатель на буфер-приемник (выделенный после первого шага)
cchWideChar = размер буфера-приемника (результат вызова ф-ии на перовом шаге)

Далее аналогичным образом (т.е. тоже "в два прохода") пользуемся ф-ей WideCharToMultiByte.
Задаем CodePage = CP_UTF8 (это WinAPI-шная константа, если что, она имеет значение 65001)
Ответить