You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LibGdx Android与PHP交互:文本文件特殊字符存储异常问题

问题原因与解决方案

核心问题

你遇到的特殊字符存储异常,本质是URL参数未编码导致的:

  • GET请求中,#(锚点标识)、?(参数分隔符)、+(空格替代符)这类字符属于URL保留字符,直接拼接会被浏览器/服务器错误解析
  • 你当前直接把未编码的参数放到请求Content中,而GET请求的参数应该在URL的查询字符串里,服务器可能无法正确读取Content中的参数,进而导致解析错乱

修复步骤

1. 对参数进行URL编码(Java端)

使用URLEncoder.encode()对用户名和分数进行编码,指定UTF-8编码格式,确保特殊字符被转义为URL安全的格式:

if (!name.equals("")) {
    Highscore.name = name;
    setActiveScreen(new Highscore());

    // 对参数进行URL编码
    String encodedName = null;
    String encodedPunkte = null;
    try {
        encodedName = URLEncoder.encode(name, "UTF-8");
        encodedPunkte = URLEncoder.encode(String.valueOf(punkte), "UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

    // 拼接编码后的查询字符串到URL
    String URL = "https://www.test.de/zzz/mobile.php?name11=" + encodedName + "&punkte11=" + encodedPunkte;

    Net.HttpRequest httpGET = new Net.HttpRequest(Net.HttpMethods.GET);
    httpGET.setUrl(URL);

    Gdx.net.sendHttpRequest(httpGET, new Net.HttpResponseListener() {
        @Override
        public void handleHttpResponse(Net.HttpResponse httpResponse) {
            Gdx.app.log("MSG", httpResponse.getResultAsString());
        }

        @Override
        public void failed(Throwable t) {
            Gdx.app.log("LOGIN", "was NOT successful!");
        }

        @Override
        public void cancelled() {
            Gdx.app.log("LOGIN", "was cancelled!");
        }
    });
}

2. PHP端确保正确解码与存储

PHP会自动解码GET参数,但需要确保:

  • 服务器php.ini中default_charset设置为UTF-8
  • 写入文件时保持UTF-8编码,避免乱码
    示例PHP代码片段:
<?php
// 获取并校验参数
$name = $_GET['name11'] ?? '';
$punkte = $_GET['punkte11'] ?? '';

// 过滤非法字符(可选,防范恶意输入)
$name = htmlspecialchars($name, ENT_QUOTES, 'UTF-8');
$punkte = intval($punkte);

// 追加写入高分文件,加锁防止并发写入问题
$record = $name . '|' . $punkte . "\n";
file_put_contents('highscores.txt', $record, FILE_APPEND | LOCK_EX);

echo "保存成功";
?>

额外建议

如果需要传输复杂内容或敏感信息,建议改用POST请求,POST参数放在请求体中,更适合这类场景:

// POST请求示例
String encodedName = URLEncoder.encode(name, "UTF-8");
String encodedPunkte = URLEncoder.encode(String.valueOf(punkte), "UTF-8");
String postData = "name11=" + encodedName + "&punkte11=" + encodedPunkte;

Net.HttpRequest httpPOST = new Net.HttpRequest(Net.HttpMethods.POST);
httpPOST.setUrl("https://www.test.de/zzz/mobile.php");
httpPOST.setContent(postData);
// 设置请求头,告知服务器参数编码格式
httpPOST.setHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");

// 发送请求...

内容的提问来源于stack exchange,提问作者HermannGo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 19:47:38