

解决delphi连接PHP页面提交到mysql数据库再显示出来乱码
1. delphi11提交到PHP页面后delphi收到的返回值中有中文则输出到memo中乱码
解决方法是使用流的方式提交到PHP页面,PHP页面也用流的方式接收再上传到数据库
1)delphi中使用流的方式提交数据到PHP页面
先把要上传成的内容生成字符串
upStr := 'cname=' + getStrToEnd('主机名:', syslist);
UpStr := UpStr + '&username=' + GetEnvironmentVariable('USERNAME'); //当前用户名
procedure PostComputerData(Upstr:string; memo: TMemo); //将电脑的数据提交到数据库
var
http:TIdHTTP;
aUrl:string;
reqstream, respstream:TStringStream;
begin
http:=TIdHTTP.Create(nil);
reqstream:=TStringStream.Create(upstr, TEncoding.UTF8);
respstream:=TStringStream.Create('',65001);
reqstream.Position:=0;
try
aUrl:='http://aa.gxnn.cc:8081/a/diguophp/admin/cjzs/cjzspostdata2.php';
http.Post(aUrl,reqstream,respstream);
Memo.Lines.Add(respstream.DataString);
Memo.Lines.Add(http.ResponseText);
finally
respstream.Free;
reqstream.Free;
http.Free;
end;
end;
2)PHP页面也使用流的方式接收数据
<?php
// 获取以流方式提交的数据
$data = file_get_contents('php://input');
// 解析提交的数据(这里假设数据是以 urlencoded 格式提交的)
parse_str($data, $parsedData);
// 输出获取到的数据
echo "Name: " . $parsedData['name'] . "<br>";
echo "Email: " . $parsedData['email'] . "<br>";
?>
3)在PHP页面提交到数据时要在Conn后将编码设为utf8
if (!$conn->set_charset("utf8")) { // 设置字符编码为 UTF-8 //这里很重要,没有这句PHP上传到mysql中的是GBK编码,在PHPMYamdin中显示乱码
die("设置字符编码失败: " . $conn->error);
}
4)在PHP页面查询数据库内容显示时也要到编码设为utf8,方法同3)
2. 提交到数据库后用PHPmyadmin打开表查看有中文的字段显示乱码
PHP页面收到delphi传来的数据保存为txt(默认为utf8编码)文件不乱码,但上传到数据库乱码
解决方法是在Connect后加上设置编码的语句
// 检查连接
if ($conn->connect_error) { die("连接失败: " . $conn->connect_error);}
// 设置字符编码为 UTF-8 //这里很重要,没有这句PHP上传到mysql中的是GBK编码,在PHPMYamdin中显示乱码
if (!$conn->set_charset("utf8")) { die("设置字符编码失败: " . $conn->error); }
测试:上传的同时也将SQL语句保存到文本文件中,查看是否乱码
// 执行插入操作并检查结果
if ($conn->query($sql) === TRUE) {
// 下面是将变量$sql保存到当前目录的example.txt文件路径
$filePath = "./example.txt"; // 当前目录下的 example.txt 文件
file_put_contents($filePath, $sql);// // 将变量的值写入文件
echo "数据已保存到文件:$filePath";
echo "数据更新成功";
} else {
echo "updataerror:" . $conn->error;
// echo "no" . $conn->error;
}
3. 再用PHP代码查询输出数据库的内容,中文字符也乱码
解决方法同2,也是在连接数据的语句后设置加上设置字符编码的语句
4. MySQL默认为Latin1编码,即ISO-8859-1编码,也就是N++中的西欧语系,经测试 ANSI和utf8可以转为ISO-8859-1,但不能再转回去,转后每个汉字为6字节不能正常显示
西欧语系本身没有不支持中文转后会乱码,也不能再转回去