forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Основной форум (http://forum.boolean.name/forumdisplay.php?f=49)
-   -   utf-8 -> win-1251 (http://forum.boolean.name/showthread.php?t=13381)

Trazzy 20.09.2010 09:28

utf-8 -> win-1251
 
Требуется передать на сайт строку с русским текстом в кодировке win-1251.
Нужно перевести utf-8 -> win-1251 - как это реализовать?

(использую POST)
PHP код:

program sendtosite;
uses Lib_proweb;

//...
q_request('http://сайт.ру/'POST'string=русский-текст''none');
//... 


SBJoker 20.09.2010 10:30

Ответ: utf-8 -> win-1251
 
все реквесты передаются только в кодировке base64, кодируй в неё и передавай.

Trazzy 20.09.2010 10:35

Ответ: utf-8 -> win-1251
 
Цитата:

Сообщение от SBJoker (Сообщение 162770)
все реквесты передаются только в кодировке base64...

ясно, не знал

Цитата:

Сообщение от SBJoker (Сообщение 162770)
...кодируй в неё и передавай.

кто знает как это сделать?
Upd: в proweb нашел:) .. буду разбираться

Phantom 20.09.2010 14:57

Ответ: utf-8 -> win-1251
 
Цитата:

все реквесты передаются только в кодировке base64
Base64 тут не юзают, вроде (хотя наверно можно, если указать правильный Контент Тип). Я в PHP когда нужно отправить запрос к стороннему серверу, всегда юзаю urlencode() и проблем никогда не было. Вот описание из мануала:

Цитата:

urlencode - URL-кодирует строку.

string urlencode (string str)

Возвращает строку, в которой все не алфавитно-числовые символы (кроме -_.) заменены на знак процентов (%) с последующими двумя 16-ричными цифрами и пробелами, кодированными как знаки плюс (+). Она кодируется тем же способом, что и post данные WWW-формы, то есть как в типе носителя application/x-www-form-urlencoded.
И этот метод попроще, чем base64, даже битовые сдвиги юзать не надо. :-D

Trazzy 20.09.2010 22:08

Ответ: utf-8 -> win-1251
 
Цитата:

Сообщение от Phantom (Сообщение 162783)
..(хотя наверно можно, если указать правильный Контент Тип)..

у меня стоит:
PHP код:

q_property('Content-Type''application/x-www-form-urlencoded'); 

Раньше показывало как "???????-?????", я попробовал так:
PHP код:

q_request('http://сайт.ру/'POSTbase64_encode('string=русский-текст'), 'none'); 

- переводит в белиберду типа "8PPx8ero6S3y5erx8g=="

ViNT 20.09.2010 22:39

Ответ: utf-8 -> win-1251
 
Цитата:

Сообщение от 2Fake (Сообщение 162814)
у меня стоит:
PHP код:

q_property('Content-Type''application/x-www-form-urlencoded'); 

Раньше показывало как "???????-?????", я попробовал так:
PHP код:

q_request('http://сайт.ру/'POSTbase64_encode('string=русский-текст'), 'none'); 

- переводит в белиберду типа "8PPx8ero6S3y5erx8g=="


Белиберда это как раз Base64

Phantom 20.09.2010 22:42

Ответ: utf-8 -> win-1251
 
Я же тебе написал как делать. Преобразуй все символы, не входящие в диапазон [a-zA-Z0-9._-] в % + шестнадцатиричный код символа. Например, было "слово", а стало "%D1%81%D0%BB%D0%BE%D0%B2%D0%BE" (тут в примере для кодировки UTF-8 ). Ты смотри кодировку страницы, где у тебя оригинальная форма находится. Форма отправляет текст в той кодировке, в какой страница написана.

SBJoker 20.09.2010 22:54

Ответ: utf-8 -> win-1251
 
а base64 всёрно круче и экономичнее...

Trazzy 21.09.2010 01:05

Ответ: utf-8 -> win-1251
 
Форма находится на стороннем сервере [кодировка UTF-8]..
Отправляю так:
PHP код:

program sendtosite;
uses proweb;
var
  
fldindinteger;
  
btnclickedcommand;

begin
  ClearForm
;
  
ShowForm;
  
SetFormTitle('Отправка');
  
fld:=formAddTextField('Текст:'''100TF_ANY);
  
btn:=CreateCommand('OK'CM_SCREEN1);
  
AddCommand(btn);
  
repeat
   clicked 
:= GetClickedCommand;
  
until clicked <> EmptyCommand;
  
q_property('Accept''*/*');
  
q_property('Content-Type''application/x-www-form-urlencoded');
  
q_property('User-Agent''myprog');
  
ind:=q_request('http://сайт.ру/index.php'POST'string='+FormGetText(fld), 'none');
end

Возращает строку "Булка.", как "?????."

Что не так?

ViNT 21.09.2010 01:12

Ответ: utf-8 -> win-1251
 
На сколько я понимаю, если в ContentType указано application/x-www-form-urlencoded, то строку нужно предварительно перекодить так, как говорил Phantom.

Trazzy 21.09.2010 01:25

Ответ: utf-8 -> win-1251
 
Тестировал на localhost'е. Попробовал убрать строчку

PHP код:

q_property('Content-Type''application/x-www-form-urlencoded'); 

- POST не принимает ничего..

ViNT 21.09.2010 01:28

Ответ: utf-8 -> win-1251
 
Естественно, параметр ContentType должен быть задан. Попробуй передать закодированную строку (с q_property('Content-Type', 'application/x-www-form-urlencoded'); ).

Trazzy 21.09.2010 02:25

Ответ: utf-8 -> win-1251
 
Сходил на перекур, попробовал сделать так:

PHP код:

program sendtosite
uses proweb
var 
  
fldindniinteger
  
btnclickedcommand
  
bazaalfmessage_mchaready_mstring;
  
rus_alfrus_mess: array[0..400of string;
  
continboolean;

procedure Initial//инициализация (нужна для функции encod)
begin
baza 
:= '%D0%B0%D0%B1%D0%B2%D0%B3%D0%B4%D0%B5%D1%91%D0%B6%D0%B7%D0%B8%D0%B9%D0%BA%D0%BB%D0%BC%D0%BD%D0%BE%D0%BF%D1%80%D1%81%D1%82%D1%83%D1%84%D1%85%D1%86%D1%87%D1%88%D1%89%D1%8A%D1%8B%D1%8C%D1%8D%D1%8E%D1%8F%D0%90%D0%91%D0%92%D0%93%D0%94%D0%95%D0%81%D0%96%D0%97%D0%98%D0%99%D0%9A%D0%9B%D0%9C%D0%9D%D0%9E%D0%9F%D0%A0%D0%A1%D0%A2%D0%A3%D0%A4%D0%A5%D0%A6%D0%A7%D0%A8%D0%A9%D0%AA%D0%AB%D0%AC%D0%AD%D0%AE%D0%AF';
alf  := 'абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';
n:=0;
for 
:= 0 to 65 do
  
begin
    rus_alf
[i] := getchar(alfi);
    
rus_mess[i] := copy(bazann+6);
    
n:= n+6;
  
end;
end;

function 
encod(messstring): string//этим мы перекодируем строку
begin
message_m
:='';
for 
:= 0 to length(mess)-do
    
begin
    contin
:=false;
      for 
n:=0 to 65 do
      
begin
      cha
:=getchar(mess,i);
      if 
contin=false then
        begin
        
if cha rus_alf[nthen 
            begin
            message_m 
:= message_m rus_mess[n] ;
            
contin:=true;
            
end;
            else 
contin:=false;
        
end;
      
end;
      if 
contin=false then message_m:=message_m+cha;
    
end;
encod:=message_m;
end;

begin //код программы
  
Initial;
  
ClearForm
  
ShowForm
  
SetFormTitle('Отправка'); 
  
fld:=formAddTextField('Текст:'''100TF_ANY); 
  
btn:=CreateCommand('OK'CM_SCREEN1); 
  
AddCommand(btn); 
  
repeat 
   clicked 
:= GetClickedCommand
  
until clicked <> EmptyCommand;
  
ready_m:=encod(FormGetText(fld)); //перекодировали то, что ввели с формы
  
q_property('Accept''*/*'); 
  
q_property('Content-Type''application/x-www-form-urlencoded'); 
  
q_property('User-Agent''myprog'); 
  
ind:=q_request('http://localhost/index.php'POST'go='+ready_m'none'); //и отправили
end

на localhost'е такой код:

PHP код:

<?php

//это содержание файла index.php (UTF-8)
//(в ".htaccess" стоит "AddDefaultCharset utf-8")

$getp=$_POST['go'];

$gets=@file_get_contents('br.dat');
$gets=$getp."\n".$gets;

$sava=fopen('test.dat''w');
fputs($sava$gets);
fclose($sava);

?>

Результаты:
localhost - принял, создался файл "test.dat" (ANSI-кирилица) с введенной строкой..
сторонний сайт - отказался!!

Upd: не знаю что и делать :(

Trazzy 22.09.2010 04:50

Ответ: utf-8 -> win-1251
 
Ну что ни у кого больше нет идей?.. Что может еще быть?

SBJoker 22.09.2010 10:49

Ответ: utf-8 -> win-1251
 
Я уже всё написал, как это делается.

Phantom 22.09.2010 15:03

Ответ: utf-8 -> win-1251
 
И я тоже. Если у тебя на локалхосте сохраняет в ANSI, то с чего бы стороннему серверу принимать в utf-8? У тебя в коде вероятно где-то ошибка.

Trazzy 22.09.2010 23:17

Ответ: utf-8 -> win-1251
 
код я выложил (он практически ничем не отлечается от того, что я использую для другого сайта)...
ладно, буду пробовать по разному.. (т.с. методом тыка:-D)
но и на этом всем спасибо)))

Phantom 22.09.2010 23:41

Ответ: utf-8 -> win-1251
 
2Fake, покажи, что за сайт и что за форма.


Часовой пояс GMT +4, время: 16:55.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot