Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/35: Рейтинг темы: голосов - 35, средняя оценка - 4.89
74 / 54 / 17
Регистрация: 10.07.2014
Сообщений: 329

TEncoding - пример от разработчика

21.11.2014, 18:10. Показов 7424. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот есть такой пример от разработчика http://docwiki.embarcadero.com/CodeExamples/XE7/en/TEncoding_(C++)
доделанный мною чтобы возвращал 1251:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <memory>       //For STL auto_ptr class
//---------------------------------------------------------------------------
 
#pragma argsused
String LoadFile(String NameFile)
{
  // Sample to convert a file of any encoding to UTF8
  TEncoding *LEncoding = NULL;
  std::auto_ptr<TFileStream> LFileStream(new TFileStream(NameFile, fmOpenRead));
 
  // Read file into buffer.
  TBytes myBytes;
  std::auto_ptr<TBytesStream> myBytesStream(new TBytesStream(myBytes));
  myBytesStream->CopyFrom(LFileStream.get(), LFileStream->Size);
 
  // Identify encoding and convert buffer to UTF8.
  int LOffset = TEncoding::GetBufferEncoding(myBytesStream->Bytes, LEncoding);
  if (LOffset == 0)
    return ""; // Unknown encoding; do not convert.
  myBytes = TEncoding::Convert(LEncoding, TEncoding::GetEncoding(1251),
                               myBytesStream->Bytes,
                               LOffset, myBytesStream->Size-LOffset);
  return StringOf(myBytes);
}
Но он не работает.
Когда я ему подсовываю текстовый файл в UTF8 он всегда в строке
C++
1
 int LOffset = TEncoding::GetBufferEncoding(myBytesStream->Bytes, LEncoding);
возвращает 0
Как с этим борются?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.11.2014, 18:10
Ответы с готовыми решениями:

Ошибка при сохранении StringList: неверное преобразование TEncoding::UTF7
fConfig-&gt;Add(&quot;net_graph 1&quot;); if(sSaveDialog1-&gt;Execute()) fConfig-&gt;SaveToFile(sSaveDialog1-&gt;FileName, TEncoding::UTF7); И в файле...

Почему не работает TEncoding в Делфи 7?
ругается на всё и сразу, может подскажите чем заменить можно? а то текстовые результаты теста на моём компьютере нормально выглядят, а на...

Работа для Java EE разработчика /WEB Разработчика Санкт-Петербург
Должностные обязанности: - Разработка клиент-серверного ПО; - Разработка интранет WEB-приложений; - Разработка средних и крупных...

6
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.11.2014, 20:30
Что мешает грузить ютф через TStringList или TStringSream ?
0
74 / 54 / 17
Регистрация: 10.07.2014
Сообщений: 329
24.11.2014, 12:06  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Что мешает грузить ютф через TStringList или TStringSream
Наверное мое незнание...
Подскажешь как?

вот еще вопрос.
Загрузил я файл в TRichEdit вот так:
C++
1
        reText->Lines->LoadFromFile(nf);//reText - типа TRichEdit, nf - имя файла, полный путь
win1251 грузит нормально
utf8 - вижу крякозябрики, ну как UTF8
Пытаюсь применить функцию перекодирования:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
String DeCodePage(String inS)
{
  String Res;
  TStringList *sl = new TStringList();
  sl->Text = inS;
  TBytes myBytes;
  TBytesStream *BS = new TBytesStream(myBytes);
  try {
    try {
      sl->SaveToStream(BS);
      BS->Position = 0;
      myBytes = TEncoding::Convert(TEncoding::UTF8, TEncoding::GetEncoding(1251),BS->Bytes,0, BS->Size);
      Res = StringOf(myBytes);
    } catch (...) {
//      Log("Ошибка перекодирования текста",0);//Функция логирования, в данном контексте неинтересна
    }
  } __finally{
    delete BS;
    delete sl;
  }
  return Res;
}
Вызов:
C++
1
reText->Lines->Text = DeCodePage(reText->Lines->Text);
Если текст содержит короткие строки, то перекодирует. Если текст содержит длинные строки, не помещающиеся в ширину РичЭдита - то Convert возвращает NULL
На всякий случай прикреплю тексты
первый вообще конвертит автоматически, в ричэдит я вижу корректный текст
второй - грузит крякозябры, при конвертации возвращает NULL
третий - грузит крякозябры, но функция конвертирования отрабатывает нормально.

Да, пробовал до этого применять (устаревшую?) функцию Utf8ToAnsi - конвертирует.. почти. Ошибочно воспринимает большие русские "Р" "З" буквы
Вложения
Тип файла: txt 1.txt (164 байт, 9 просмотров)
Тип файла: txt 2.txt (9.0 Кб, 6 просмотров)
Тип файла: txt 3.txt (511 байт, 6 просмотров)
0
74 / 54 / 17
Регистрация: 10.07.2014
Сообщений: 329
24.11.2014, 12:49  [ТС]
Использование функции из блога уважаемого Avazart,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
wchar_t * utf8_to_unicode(char *utf8_string)
{
    int err;
    wchar_t * res;
    int res_len = MultiByteToWideChar(
        CP_UTF8,            // Code page
        0,                  // No flags
        utf8_string,        // Multibyte characters string
        -1,                 // The string is NULL terminated
        NULL,               // No buffer yet, allocate it later
        0                   // No buffer
        );
    if (res_len == 0)
    {
        return NULL;
    }
    res = (wchar_t*)calloc(sizeof(wchar_t), res_len);
    if (res == NULL)
    {
        return NULL;
    }
    err = MultiByteToWideChar(
        CP_UTF8,            // Code page
        0,                  // No flags
        utf8_string,        // Multibyte characters string
        -1,                 // The string is NULL terminated
        res,                // Output buffer
        res_len             // buffer size
        );
    if (err == 0)
    {
        free(res);
        return NULL;
    }
    return res;
}//------------------------------------------------------------------------------
Имеет тот же эффект, что использование Utf8ToAnsi
Ошибка конвертирования
"З" �-аказчик вместо Заказчик
"Р" � егулярное вместо Регулярное
и т.п.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
24.11.2014, 14:53
http://docwiki.embarcadero.com... adFromFile
http://docwiki.embarcadero.com... eam.Create
0
74 / 54 / 17
Регистрация: 10.07.2014
Сообщений: 329
25.11.2014, 14:43  [ТС]
В общем, нашел ответ на вопрос из стартового топика.
GetBufferEncoding ищет сигнатуру в начале файла, которая внезапно должна откуда то быть в текстовом(!) файле
Если первые три байта имеют значение EFBBBF (в виде строки "п»ї")- то эти компоненты считают, что файл в UTF8
Блокнот при сохранении действительно добавляет такую сигнатуру. И NotePad+
Но это не у всех редакторов работает..
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
25.11.2014, 15:07

Не по теме:

Почему вам нужно решение обязательно через "труднодоступные" места?



BOM
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.11.2014, 15:07
Помогаю со студенческими работами здесь

Ищем программиста разработчика электронного оборудования и ученика программиста разработчика
Условия: График работы 5/2 (рассматриваем удаленную работу), Оформление по ТКРФ, полный соц.пакет. Отсутствие задержек по выплате...

Пользователь в инпуте пишет пример на сложение, например, 5+2. Внизу в виде картинок с этими цифрами вывести пример
Пользователь в инпуте пишет пример на сложение, например, 5+2. Внизу в виде картинок этих цифер вывести пример и ответ на него.

Как записать пример в Maxima? Пример внутри
Здравствуйте. Кто может записать этот пример в программе? Чтобы считал и не выдавал ошибку

Приведите пример класса с методом и конструктором. Создайте экземпляр этого класса. Правильный ли пример?
class Point { int х, у; Point(int х, int у) { this.x = х; this.у = у; } }

Не компилируется пример пример!
Добрый день, я только-только решил начать изучать програмирование на С++! Как учебное пособие использую книгу Стефана Р. Девитса...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru