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
相关产品推荐
相关产品推荐

