【问题标题】:Write UTF-8 JSON file from PHP code in WordPress plugin在 WordPress 插件中从 PHP 代码编写 UTF-8 JSON 文件
【发布时间】:2015-11-18 04:39:21
【问题描述】:

我正在编写一个 WordPress 插件,该插件需要能够写入和读取编码为 JSON 的复杂数据,其中可以包含 UTF-8 编码的文本。我在读取文件时遇到了问题(我收到 PHP 解析错误),但我现在怀疑这是因为数据实际上并未编码为 UTF-8(如我所料)而是 HTML 编码的实体。

打开输出缓冲区并写入其中的函数如下所示——我错过了什么吗??

public function createUTFOutput($filename, $json)
{
        // Tells the browser to expect a json file and bring up the save dialog in the browser
    header('Pragma: public');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Cache-Control: private', false);

    if ($json)
        header('Content-Type: text/plain; charset=utf-8');
    else
        header('Content-Type: text/csv; charset=utf-8');
    header('Content-Disposition: attachment; filename="'.$filename.'";');

        // This opens up the output buffer as a "file"
    $fp = fopen('php://output', 'w');

        // Hack to write as UTF-8 format
    fwrite($fp, pack("CCC",0xef,0xbb,0xbf));
    return $fp;
} // createUTFOutput()

    // PURPOSE: Write out data about Attribute $the_att to file $fp
public function write_att_data($fp, $the_att)
{
        // Create header to indicate Attribute record
    fwrite($fp, '{"type": "Attribute", "att-id": "'.$the_att->id.'", '."\n");
    fwrite($fp, '"att-privacy": "'.$the_att->privacy."\", \n");
    fwrite($fp, '"att-def": '.$the_att->meta_def.", \n");
    fwrite($fp, '"att-range": '.$the_att->meta_range.", \n");
    fwrite($fp, '"att-legend": '.$the_att->meta_legend."\n}");
} // write_att_data()

是否需要一些其他设置,以便将文本写入文件的 UTF-8 字符,而不是像显示在屏幕上一样的 HTML 编码字符?或者是输入过程以某种方式将 UTF-8 字符转换为 HTML 编码的字符?当我查看存储在我的 Mac 上的文件的 MIME 类型时,它们看起来确实正确。

【问题讨论】:

  • 既然您使用的是 WordPress,那么当 WordPress 内置的配置选项有足够的支持时,为什么还要尝试以独特的方式做事(将配置写入文件并以 JSON 编码)并且易于管理?
  • 这与配置 WordPress 无关——插件本身就是一个复杂的应用程序,我需要能够导出和导入数据。

标签: php json wordpress encoding utf-8


【解决方案1】:

对于那些面临同样问题的人来说,由于编码的不可预测和静默转换等,会出现很大的并发症。但是这篇博文对我很有帮助:https://www.stefan-wallin.se/utf-8-issues-in-wordpress-with-update_post_meta-and-json_encode/

【讨论】:

    【解决方案2】:

    永远不要编写自己的序列化函数。您的代码将不可避免地生成无效的 JSON。

    按照规范,JSON 是 UTF-8。我想如果你简单地使用 PHP 的内置 json_encode(),一切都会好起来的。

    您的编码实体问题是由于 WordPress 的内置功能造成的。我不知道如何从头顶覆盖它,但之前已经完成了。

    【讨论】:

    • 为什么我的代码“不可避免地会生成无效的 JSON”?它可以生成良好的 JSON 文件——唯一的问题是非 ASCII 字符。被复制的文本要么是字符串,要么是 json_encode() 结果的文本。
    • @user3780094 “唯一的问题是非 ASCII 字符”,对于初学者来说,这是一个问题。此外,您不会在输出中转义任何内容。如果您在其他地方对其进行编码,这可能不是一个大问题,但是当有保证工作的内置方法时,绝对不需要做您正在做的事情。
    • 什么内置方法?我需要保存和加载已编码 JSON 的数据文件。质疑系统的要求或 WordPress 根本不提供此应用程序所需的功能这一事实是没有帮助的。如果您可以为我提供的这个非常具体的代码提供具体的解决方案,那对我和其他人可能都非常有用。
    【解决方案3】:

    utf8_encode() 函数可能会有所帮助。

    【讨论】:

    • 这不是很具体。 WordPress 中的文本不是已经编码为 UTF-8 了吗?为什么我需要再次编码?
    • 我建议这样做是因为我在创建一个函数以获取 JSON 对象并将其转储到数组中时遇到了类似的问题。它在某些字符上出现了问题,所以我不得不使用 utf8_encode() 作为中间人。
    • @belinus:我经常看到这种类型的答案,但大多数时候盲目地应用这个功能是个坏主意。该函数不会将 anything 转换为 utf-8,而是仅将 latin-1 转换为 utf-8。第一步总是要完全弄清楚源编码,然后才能选择合适的转换方法。
    猜你喜欢
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 2013-09-01
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多