C++Builder
Начало
Форум
Помощь
Войти
Регистрация
C++Builder
>
Forum
>
Вопросы программирования
>
Общие вопросы программирования в C++Builder
>
unicode - html и C++ кодировки
Страниц: [
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
]
Вверх
Печать
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Вопросы программирования
-----------------------------
=> Общие вопросы программирования в C++Builder
=> Программирование с FMX
=> Работа с базами данных в C++Builder
=> Windows API
=> Технологии COM/DCOM, ActiveX
=> Аспекты и идеология профессиональной разработки ПО
=> Компьютерное железо и системное администрирование
=> студенческий городок
-----------------------------
Обсуждение материалов на сайте
-----------------------------
=> Обсуждений статей на сайте
=> Обсуждение материалов из файлового архива
=> Компоненты сторонних разработчиков к С++Builder
-----------------------------
Работа сайта и новости
-----------------------------
=> Ищу/предлагаю работу
=> Новости из мира программирования
=> Новости - события календаря
=> Голосования
=> Компьютерный юмор и приколы
=> Работа сайта
=> Флейм
-----------------------------
FAQ - частозадаваемые вопросы/ответы
-----------------------------
=> FAQ, общие вопросы, посвящённые C++Builder
=> FAQ, вопросы по базам данных
=> FAQ, вопросы по компонентам
Загружается...