C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: unicode - html и C++ кодировки  (Прочитано 2706 раз)
direk
Участник


Сказали спасибо: +6/-0
Offline

Сообщений: 79


unicode - html и C++ кодировки
« : 27 Январь 2014, 02:18:17 »

Возникла такая ситуация - скачивается с нета страница в виде HTML и после
некоторых манипуляций отправляется в MEMO.

Так вот, иногда попадаются символы уникода  типа K?nigin Metapha
В МЕМО они выводяться в виде кода а не символа.

Но если использовать для этого же символа кодировку с приведенного
ниже списка для  C/C++/Java source code   -   "\u00F6", тогда все нормально.

Так вот вопрос - как оптимально можно переводить символы с одной кодировки в другую???
А то я чуток уже запутался в них ))

Encodings
HTML Entity (decimal)          ?
HTML Entity (hex)           ?
HTML Entity (named)            ?
UTF-8 (hex)                   0xC3 0xB6 (c3b6)
UTF-8 (binary)                  11000011:10110110
UTF-16 (hex)                  0x00F6 (00f6)
UTF-16 (decimal)                  246
UTF-32 (hex)                  0x000000F6 (00f6)
UTF-32 (decimal)                 246
C/C++/Java source code      "\u00F6"
Python source code          u"\u00F6"
Записан
direk
Участник


Сказали спасибо: +6/-0
Offline

Сообщений: 79


Re: unicode - html и C++ кодировки
« Ответ #1 : 31 Январь 2014, 22:58:17 »

Пока что делаю  тупо замену кодировки символа Юникода с одной на другую через StringReplace:

TStringList *aaa_Text = new TStringList();
TStringList *bbb_Text = new TStringList();
aaa_Text->Text  =   StringReplace( bbb_Text->Text, "?", L"\u00F6", TReplaceFlags() RzMemo3->Text = aaa_Text->Text;


То есть вижу какой-то новый символ Юникода, просто добавляю новою строку StringReplacев код программы.
Наверное не очень практично, ничего больше не придумал.

Если будут какие-то советы, с радостью почитаю...
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: unicode - html и C++ кодировки
« Ответ #2 : 02 Февраль 2014, 21:08:07 »

Нужна более универсальная функция для замены юникодных символов в HTML на C++/Delphi. Например, попробуй:
Код:
#include
#include

String __fastcall TForm1::HTML2C(const String& AText)
{
static const String START = "";
String sOut(AText);
int Pos = PosEx(START, sOut, 1);
int Pos2, nNum, nLength;
while(Pos > 0) {
Pos2 = PosEx(";", sOut, Pos);
if(Pos2 nLength = Pos2 - Pos + 1;
try { nNum = StrToInt(MidStr(sOut, Pos + 2, nLength - 3)); }
catch(Exception&) {
Pos = PosEx(START, sOut, Pos2);
continue;
}
sOut.Delete(Pos, nLength);
sOut.Insert("\\u" + IntToHex(nNum, 4), Pos);
Pos2 += 6 - nLength;
Pos = PosEx(START, sOut, Pos2);
}
return sOut;
}

Писал в блокноте, не тестировал... Могут быть баги - посмотри ))

PS. Протестировал - работает )
« Последнее редактирование: 02 Февраль 2014, 21:33:50 от S0mbre » Записан
direk
Участник


Сказали спасибо: +6/-0
Offline

Сообщений: 79


Re: unicode - html и C++ кодировки
« Ответ #3 : 03 Февраль 2014, 02:17:24 »

Спасибо большое! Наверное это самый оптимальный вариант.
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: unicode - html и C++ кодировки
« Ответ #4 : 03 Февраль 2014, 08:51:37 »

Цитата: direk от 03 Февраль 2014, 02:17:24
Спасибо большое! Наверное это самый оптимальный вариант.

Только учти - эта функция для генерации (мета)кода C++, а не самих юникодных символов. Для того, чтобы отображать в мемо сами символы (например, K?nigin), надо слегка изменить функцию.
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: unicode - html и C++ кодировки
« Ответ #5 : 03 Февраль 2014, 09:24:44 »

Вот модифицированная версия функции. Дополнительный параметр Meta позволяет включить/выключить преобразование для кода. Т.е. например:
1) при Meta = true,     "" --> "\u00C7a"
2) при Meta = false,    "" --> ""
Код:
String __fastcall TForm1::HTML2C(const String& AText, bool Meta)
{
static const String START = "";
String sOut(AText);
int Pos = PosEx(START, sOut, 1);
int Pos2, nNum, nLength;
while(Pos > 0) {
Pos2 = PosEx(";", sOut, Pos);
if(Pos2 nLength = Pos2 - Pos + 1;
try { nNum = StrToInt(MidStr(sOut, Pos + 2, nLength - 3)); }
catch(Exception&) {
Pos = PosEx(START, sOut, Pos2);
continue;
}
sOut.Delete(Pos, nLength);
if(Meta) {
sOut.Insert("\\u" + IntToHex(nNum, 4), Pos);
Pos2 += 6 - nLength;
}
else {
sOut.Insert(Char(nNum), Pos);
Pos2 -= nLength - 1;
}
Pos = PosEx(START, sOut, Pos2);
}
return sOut;
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.029 секунд. Запросов: 19.