【发布时间】:2011-03-01 02:16:33
【问题描述】:
AS3 文档说 AS3 中的字符串是 UTF-16 格式。
Flash Clip 上有一个文本框,用户可以在其中输入一些数据。
单击按钮时,我希望将此数据发送到 php 脚本。
我已设置好所有内容,但似乎 PHP 脚本以 UTF-16 格式获取数据。数据库中的数据(即utf-8)显示了一些无法识别的字符(其中使用了特殊字符),这意味着数据没有以正确的编码发送。
var variables:URLVariables=new URLVariables;
var varSend:URLRequest=new URLRequest("http://website.com/systematic/accept.php");
varSend.method=URLRequestMethod.POST;
varSend.data=variables;
var varLoader:URLLoader=new URLLoader;
varLoader.dataFormat=URLLoaderDataFormat.VARIABLES;
varLoader.addEventListener(Event.COMPLETE, completeHandler);
单击提交按钮时,将执行以下处理程序。
function sendData(event:MouseEvent) : void {
// i guess here is the problem (tbName.text is UTF-16)
variables.name = tbName.text;
varLoader.load(varSend);
}
有没有办法发送数据,以便 PHP 脚本获取 UTF-8 格式的数据?
(PHP 脚本正在使用 $_POST['name'] 检索值)。
EDIT(在有用的 cmets 之后):
我尝试使用 iconv() 将 POST 变量转换为 UTF-8,但我只得到问号。这可能意味着我假设 php 以 UTF-16 格式获取字符串是错误的。似乎没有。但现在我完全不知道如何解决这个问题。
有问题的字符是克罗地亚字符(č、ć、š、ž 和 đ),均采用 Windows-1250 编码。如果我手动编辑 phpMyAdmin 中的条目并输入任何这些字符,一切都会很好。但是如果我是通过 flash 来做的,那就不行了。
另一个奇怪的事情是,我已经删除了 iconv 并将所有内容都放在开头,现在只有非特殊字符会显示给第一个克罗地亚人。例如,如果我写“ačasdfadfa”,那么只有“a”会存储在数据库中。
另一个修改:
我现在尝试将克罗地亚语字符转换为 ASCII(参见下面的代码),然后在 PHP 端将它们返回为 č、ć 等。 Flash 显然是正确的(因为不再有特殊字符了),但是 PHP 没有正确地将字符转换回字符串。这就是我正在做的。
所以我猜这与 PHP 或它如何将数据存储到数据库中有关。 PHP 文件本身是 UTF-8 编码的。
【问题讨论】:
-
@cornelije 可能是这里的编码混淆了?包含未转换的 Windows-1250 字符的 UTF-8 字符串必然会中断。也许 Flash 没有得到正确的转换? --- 特殊字符正常后一切都被截断的行为(解析以当前使用的编码之外的第一个字符结束。)
-
数据库连接是UTF-8吗? (
SET NAMES utf8) -
我误读了你的评论,我猜是这样,我正在做 mysql_set_charset('utf8',$con);我已经读到这是执行 SET NAMES utf8 的新方法(php 5.2)。这是真的吗?
-
文档说 Flash 在内部使用 UTF-16 存储字符串。但是它在发送数据时使用 UTF-8(默认情况下,至少,您可以使用
System.useCodePage = true;将其更改为主机的代码页,但这几乎总是一个坏主意。对于有价值的东西,我可以告诉你,我经常编写代码将数据从 Flash 发送到 PHP,从来没有遇到过问题。不过,我使用SET NAMES utf8,而不是您粘贴的函数(我不知道它存在)。 -
是的,应该可以。表和它们的列也是 UTF-8 的,对吧?只是检查一下,我过去忽略了这一点。
标签: php flash actionscript-3 utf-8 send