Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.08.2012, 10:03   #1
Puhovoi
Пользователь
 
Аватар для Puhovoi
 
Регистрация: 16.10.2010
Сообщений: 47
Сообщение Кодирование в UTF8 в 2010+ студии

Доброго времени суток!

Использую юникодную Delphi 2010. Необходимо из "Мария" получить "МариÑ" - грубо говоря, как это выглядело бы при работе функции utf8encode в delphi 7.

Заранее спасибо за ответы.
Puhovoi вне форума Ответить с цитированием
Старый 18.08.2012, 10:13   #2
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Ээээ.... а в чём проблема, код же будет тот же самый?

И в Delphi 7 и в Delphi 2010:
Код:
var
  S: String;
  UTF8: UTF8String; // или AnsiString;
begin
  S := 'Мария';
  UTF8 := UTF8Encode(S);
end;
А в Delphi 2010 можно ещё проще:
Код:
var
  S: String;
  UTF8: UTF8String; // AnsiString не подойдёт
begin
  S := 'Мария';
  UTF8 := S;
end;
Список функций преобразованя UTF-8 в Delphi.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 18.08.2012, 10:18   #3
Puhovoi
Пользователь
 
Аватар для Puhovoi
 
Регистрация: 16.10.2010
Сообщений: 47
По умолчанию

Мне требуется записать в memorystream русский текст в UNICODE. Записывается - в ANSI, как ни кодируй.
Puhovoi вне форума Ответить с цитированием
Старый 18.08.2012, 10:24   #4
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Ошибка в 42 строке.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 18.08.2012, 10:25   #5
Puhovoi
Пользователь
 
Аватар для Puhovoi
 
Регистрация: 16.10.2010
Сообщений: 47
По умолчанию

UTF8EncodeToShortString (s) - дает нужный результат.

Последний раз редактировалось Puhovoi; 18.08.2012 в 10:33.
Puhovoi вне форума Ответить с цитированием
Старый 18.08.2012, 10:42   #6
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

По моему, ты что-то путаешь. Код-то покажи.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 18.08.2012, 10:55   #7
Puhovoi
Пользователь
 
Аватар для Puhovoi
 
Регистрация: 16.10.2010
Сообщений: 47
По умолчанию

Есть класс TPart, для формирования данных POST-запроса, с mime-типом multipart/form-data.

Функция добавления имя-параметр выглядит так:

Код:
procedure TPart.NewField (const name: string; const value: string);
begin
  WriteStrToStream (ResultDocument, '--' + Boundary + CRLF + 'Content-Disposition: form-data; name="' + name + '"' + CRLF + CRLF + value + CRLF);
end;
Так вот некоторые сайты (твиттер яркий тому пример) принимают только юникод, соответственно в value приходится передавать UTF8EncodeToShortString (value).
Puhovoi вне форума Ответить с цитированием
Старый 18.08.2012, 10:57   #8
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

А можешь показать прототип WriteStrToStream и пример как ты вызываешь TPart.NewField с UTF8EncodeToShortString?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 18.08.2012, 11:03   #9
Puhovoi
Пользователь
 
Аватар для Puhovoi
 
Регистрация: 16.10.2010
Сообщений: 47
По умолчанию

WriteStrToStream взята из библиотеки Synapse (под которую и писалась обертка для более удобного обращения):

Код:
procedure WriteStrToStream(const Stream: TStream; Value: AnsiString);
{$IFDEF CIL}
var
  buf: Array of Byte;
{$ENDIF}
begin
{$IFDEF CIL}
  buf := BytesOf(Value);
  Stream.Write(buf,length(Value));
{$ELSE}
  Stream.Write(PAnsiChar(Value)^, Length(Value));
{$ENDIF}
end;
Вызов стандартный:
Код:
part.newfield ('user', utf8encodetoshortstring ('Мария'));
P.s.: абсолютное большинство сайтов, к слову, unicode в подобных запросах не переваривают.
Puhovoi вне форума Ответить с цитированием
Старый 18.08.2012, 11:19   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Ага, понял. Тебе попался хитрый фокус. Мне нравится.

В общем, есть мнение, что правильно надо так:
Код:
procedure TPart.NewField(const name: String; const value: String);
begin
  WriteStrToStream(ResultDocument, UTF8Encode('--' + Boundary + CRLF + 'Content-Disposition: form-data; name="' + name + '"' + CRLF + CRLF + value + CRLF));
end;

...

part.NewField('user', 'Мария');
если Boundary и CRLF имеют тип String (или же это константы).

В противном случае (если они однобайтовые строки AnsiString/UTF8String/RawByteString), то:
Код:
procedure TPart.NewField (const name: String; const value: String);
begin
  WriteStrToStream(ResultDocument, UTF8String('--' + Boundary + CRLF + 'Content-Disposition: form-data; name="') + UTF8Encode(name) + UTF8String('"' + CRLF + CRLF + value + CRLF)));
end;

...

part.NewField('user', 'Мария');
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
UTF8 renigal1 PHP 4 23.03.2012 12:32
Проблема с настройкой студии Trust_357 Помощь студентам 0 10.03.2011 23:42
Вопросы по вижуал студии XLBaron Visual C++ 5 13.01.2011 18:57
Вопрос в вижл студии MakTpaxep Общие вопросы C/C++ 5 12.09.2010 07:06