サーバーに送信されるテキストがUTF-8でエンコードされていません。
AddFormField()
のすべてのコールで、AContentType
パラメータの代わりにACharset
パラメータにtext/plain
メディアタイプが指定されています。 AddFile()
とは異なり、3番目のパラメータAddFormField()
は文字セットであり、4番目のパラメータはメディアタイプです。無効な文字セット、TIdMultipartFormDataStream
バイト$3F
('?'
)のようインディの組み込み生8ビット符号化の代わりに、それぞれ、Unicode文字をバイト$00 - $FF
としてU+0000 - U+00FF
をコードする、他のすべての文字を使用して終わるを通過させることによって
function AddFormField(const AFieldName, AFieldValue: string; const ACharset: string = ''; const AContentType: string = ''; const AFileName: string = ''): TIdFormDataField; overload;
。 を送信するテキストは、最初の範囲に入るようにになります。
TIdFormDataField
現在、文字セットはTIdMultipartFormDataStream
またはTIdHTTP
(現在進行中です)から継承されていないため、フィールド単位で指定する必要があります。
MeMIME
は有効なContentEncoding
値ではありません。とにかくmultipart/form-data
の投稿にはContentEncoding
の値を設定しないでください。また
FormPHP := TIdMultiPartFormDataStream.Create;
FormPHP.AddFile('imagem', AImagem, 'image/jpeg');
FormPHP.AddFormField('iduser', AIDUser, 'utf-8');
FormPHP.AddFormField('nome', ANome, 'utf-8');
FormPHP.AddFormField('data', AData, 'utf-8');
FormPHP.AddFormField('hora', AHora, 'utf-8');
FormPHP.AddFormField('mensagem', AMensagem, 'utf-8');
FormPHP.AddFormField('latitude', '1');
FormPHP.AddFormField('longitude', '1');
Response := TStringStream.Create('');
HTTP := TIdHTTP.Create(Self);
HTTP.Request.Referer := 'http://observadordecascavel.blog.br/cadastro.php';
HTTP.Post('http://observadordecascavel.blog.br/cadastro.php', FormPHP, Response);
:
がより代わりにこのような何か試してみてください
FormPHP := TIdMultiPartFormDataStream.Create;
FormPHP.AddFile('imagem', AImagem, 'image/jpeg');
FormPHP.AddFormField('iduser', AIDUser).Charset := 'utf-8';
FormPHP.AddFormField('nome', ANome).Charset := 'utf-8';
FormPHP.AddFormField('data', AData).Charset := 'utf-8';
FormPHP.AddFormField('hora', AHora).Charset := 'utf-8';
FormPHP.AddFormField('mensagem', AMensagem).Charset := 'utf-8';
FormPHP.AddFormField('latitude', '1');
FormPHP.AddFormField('longitude', '1');
Response := TStringStream.Create('');
HTTP := TIdHTTP.Create(Self);
HTTP.Request.Referer := 'http://observadordecascavel.blog.br/cadastro.php';
HTTP.Post('http://observadordecascavel.blog.br/cadastro.php', FormPHP, Response);
いずれかの方法を、フィールドのテキストが代わりにはAnsiのUTF-8を使用してエンコードされます。
更新:今、それをデフォルトでquoted-printable
にTIdFormDataField.ContentTransfer
プロパティを設定しAddFormField()
、と述べました。しかし、PHPの$_POST
はデフォルトでquoted-printable
をデコードしない、手動でquoted_printable_decode()
を呼び出す必要があります:
$iduser = quoted_printable_decode($_POST['iduser']);
$nome = quoted_printable_decode($_POST['nome']);
$data = quoted_printable_decode($_POST['data']);
$hora = quoted_printable_decode($_POST['hora']);
$mensagem = quoted_printable_decode($_POST['mensagem']);
$latitude = quoted_printable_decode($_POST['latitude']);
$longitude = quoted_printable_decode($_POST['longitude']);
あなたがquoted-printable
を使用してUTF-8テキストをエンコードするTIdFormDataField
したくない場合は、あなたがContentTransfer
プロパティを設定することができます代わり8bit
:あるいは
FormPHP.AddFormField('iduser', AIDUser, 'utf-8').ContentTransfer := '8bit';
FormPHP.AddFormField('nome', ANome, 'utf-8').ContentTransfer := '8bit';
FormPHP.AddFormField('data', AData, 'utf-8').ContentTransfer := '8bit';
FormPHP.AddFormField('hora', AHora, 'utf-8').ContentTransfer := '8bit';
FormPHP.AddFormField('mensagem', AMensagem, 'utf-8').ContentTransfer := '8bit';
FormPHP.AddFormField('latitude', '1');
FormPHP.AddFormField('longitude', '1');
:
with FormPHP.AddFormField('iduser', AIDUser) do begin
Charset := 'utf-8';
ContentTransfer := '8bit';
end;
with FormPHP.AddFormField('nome', ANome) do begin
Charset := 'utf-8';
ContentTransfer := '8bit';
end;
with FormPHP.AddFormField('data', AData) do begin
Charset := 'utf-8';
ContentTransfer := '8bit';
end;
with FormPHP.AddFormField('hora', AHora) do begin
Charset := 'utf-8';
ContentTransfer := '8bit';
end;
with FormPHP.AddFormField('mensagem', AMensagem) do begin
Charset := 'utf-8';
ContentTransfer := '8bit';
end;
FormPHP.AddFormField('latitude', '1');
FormPHP.AddFormField('longitude', '1');
いずれかの方法は、あなたが再び元のPHPコードを使用することができます。
$iduser = $_POST['iduser'];
$nome = $_POST['nome'];
$data = $_POST['data'];
$hora = $_POST['hora'];
$mensagem = $_POST['mensagem'];
$latitude = $_POST['latitude'];
$longitude = $_POST['longitude'];
あなたがquoted-printable
を使用するかどうかは、PHPの変数はUTF-8でエンコードされたテキストを保持することになります。
(ISO-8859-1にデコード)
utf8_decode()
を::
$iduser = utf8_decode($iduser);
$nome = utf8_decode($nome);
$data = utf8_decode($data);
$hora = utf8_decode($hora);
$mensagem = utf8_decode($mensagem);
$latitude = utf8_decode($latitude);
$longitude = utf8_decode($longitude);
- あなたは変数が別のエンコーディングにする必要がある場合は、必要に応じていずれかを使用することによって、それらを変換する必要があります
mb_convert_encoding()
$iduser = mb_convert_encoding($iduser, 'desired charset', 'utf-8');
$nome = mb_convert_encoding($nome), 'desired charset', 'utf-8');
$data = mb_convert_encoding($data, 'desired charset', 'utf-8');
$hora = mb_convert_encoding($hora, 'desired charset', 'utf-8');
$mensagem = mb_convert_encoding($mensagem, 'desired charset', 'utf-8');
$latitude = mb_convert_encoding($latitude, 'desired charset', 'utf-8');
$longitude = mb_convert_encoding($longitude, 'desired charset', 'utf-8');
iconv()
:
$iduser = iconv('utf-8', 'desired charset', $iduser);
$nome = iconv('utf-8', 'desired charset', $nome);
$data = iconv('utf-8', 'desired charset', $data);
$hora = iconv('utf-8', 'desired charset', $hora);
$mensagem = iconv('utf-8', 'desired charset', $mensagem);
$latitude = iconv('utf-8', 'desired charset', $latitude);
$longitude = iconv('utf-8', 'desired charset', $longitude);
最後に、クライアントに応答を返すときは、ASCII以外の文字が含まれているときにテキストをエンコードする必要があります。
header($_SERVER["SERVER_PROTOCOL"] . " 200 OK");
header('Content-Type: text/plain; charset="utf-8"');
if ($imagem != "none")
{
...
if (mysqli_affected_rows($mysqli) > 0)
print utf8_encode("Sucesso!");
else
print utf8_encode("Não foi possível inserir o registro");
}
else
print utf8_encode("Não á foi possível carregar a imagem.");
行われた変更が、問題はまだそこにある。また、クライアントは、その符号化に使用されている文字セットを知らせるために
header()
を使用する必要があります。 – wordermorr@wordermorrどのバージョンのDelphiとIndyを使用していますか? –
Delphi Seattle and Indy 10.6.2.5298 – wordermorr