【问题标题】:Calling Php Script with UTF-8 POST variables使用 UTF-8 POST 变量调用 PHP 脚本
【发布时间】: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 没有正确地将字符转换回字符串。这就是我正在做的。

http://pastebin.com/qjVcrNuV

所以我猜这与 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


【解决方案1】:

更新:

如果您从 Flash 获取的确实是 UTF-16 数据,您可以作为快速修复尝试在 PHP 中转换输入:

$name = iconv("UTF-16", "UTF-8", $_POST["name"]); 

您可以尝试一下,然后检查数据是否正常。 但是,如果可能的话,我会说最好让 Flash 发送 UTF-8 数据。

旧答案:

<speculation>

对我来说,这听起来不像 UTF-16,而更像是在 ISO-8859-1 编码环境中显示的 UTF-8 数据。你在哪里输出变量?您正在输出的页面是否也以 UTF-8 编码? (请参阅浏览器的“编码”菜单)如果我必须打赌,我会说 Flash 以 UTF-8 正确传输它们,但问题出在 输出端。

</speculation>

【讨论】:

  • 不,浏览器的编码和输出都设置为 UTF-8: (html's meta: http-equiv="content-type" content="text/html; charset=utf-8" )。此外,服务器没有设置自己的内容类型。我尝试使用以下编码(iso-8859-1、iso-8859-2、utf-8、windows-1250)显示页面,但每个都至少有一些字符错误。所以我想这不是输出的问题。甚至从 phpMyAdmin 看到的数据也不正确(如“not in utf-8”)。
  • @kornelije 啊,好的。你能贴一个坏字符的例子吗?通常可以从它们被破坏的方式中判断出哪里出了问题。
  • @kornelije 我在回答中添加了一些信息。
【解决方案2】:

如果出现问号,可能是PHP解析错误,不是flash。

我把这个 .htaccess 文件(用于 php5)放在我用日语工作的网站或带有特殊字符的网站的基本目录中......它解决了 99% 的 PHP 问题,但您仍然需要监控输入字符串(我自己还是习惯了)

<IfModule mod_php5.c>
  php_flag  output_buffering              Off
  php_value output_handler                none
  php_value default_charset               UTF-8
  php_value mbstring.language             japanese
  php_flag  mbstring.encoding_translation On
  php_value mbstring.http_input           auto
  php_value mbstring.http_output          UTF-8
  php_value mbstring.internal_encoding    UTF-8
  php_value mbstring.substitute_character none
</IfModule>

【讨论】:

    猜你喜欢
    • 2014-03-10
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多