文章851
标签121
分类10

让 JSON 更懂中文 (`JSON_UNESCAPED_UNICODE`)

在 PHP 中,使用 json_encode() 函数将数据编码为 JSON 格式时,默认情况下,中文字符会被转义为 Unicode 形式,例如 \u4e2d\u6587。如果您希望直接输出中文字符而不是转义形式,可以使用 JSON_UNESCAPED_UNICODE 选项。

1. 使用 JSON_UNESCAPED_UNICODE

1.1 基本用法

下面是如何使用 JSON_UNESCAPED_UNICODE 的示例:

<?php
$data = [
    'greeting' => '你好',
    'language' => '中文',
    'message' => '欢迎使用 JSON_UNESCAPED_UNICODE!'
];

// 默认的 json_encode
$json_default = json_encode($data);
echo "默认编码:\n$json_default\n\n";

// 使用 JSON_UNESCAPED_UNICODE
$json_unicode = json_encode($data, JSON_UNESCAPED_UNICODE);
echo "使用 JSON_UNESCAPED_UNICODE:\n$json_unicode\n";
?>

1.2 输出结果

运行上述代码,您将看到如下输出:

默认编码:
{"greeting":"\u4f60\u597d","language":"\u4e2d\u6587","message":"\u6b22\u8fce\u4f7f\u7528 JSON_UNESCAPED_UNICODE!"}

使用 JSON_UNESCAPED_UNICODE:
{"greeting":"你好","language":"中文","message":"欢迎使用 JSON_UNESCAPED_UNICODE!"}

2. 适用场景

2.1 API 返回数据

在创建 API 时,使用 JSON_UNESCAPED_UNICODE 可以使返回的 JSON 数据更易于阅读,特别是当数据包含中文文本时。

2.2 前端处理

前端 JavaScript 可以直接处理中文字符,避免了额外的字符解码。

3. 结合其他选项

您可以将 JSON_UNESCAPED_UNICODE 与其他选项结合使用,例如:

$json = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
echo $json;

3.1 输出格式化的 JSON

使用 JSON_PRETTY_PRINT 可以使输出的 JSON 更加美观:

{
    "greeting": "你好",
    "language": "中文",
    "message": "欢迎使用 JSON_UNESCAPED_UNICODE!"
}

在 PHP 中 使用 Protocol Buffers(protobuf)

Protocol Buffers(protobuf)是由 Google 开发的一种语言中立、平台中立、可扩展的序列化结构数据的方法。它常用于数据存储和网络通信。以下是如何在 PHP 中使用 Protocol Buffers 的指南。

1. 安装 Protocol Buffers

1.1 安装 Protobuf 编译器

首先,您需要安装 Protocol Buffers 编译器。可以从 GitHub releases 下载适合您系统的版本。

在 Ubuntu 上,可以通过以下命令安装:

sudo apt install protobuf-compiler

1.2 安装 PHP 扩展

您还需要安装 PHP 的 protobuf 扩展。可以通过 Composer 安装:

composer require google/protobuf

确保您的 PHP 环境已经安装了 Composer。

2. 创建 .proto 文件

创建一个 .proto 文件来定义数据结构。例如,创建一个 message.proto 文件:

syntax = "proto3";

message Person {
    string name = 1;
    int32 id = 2;
    string email = 3;
}

3. 编译 .proto 文件

使用 protoc 编译器将 .proto 文件编译为 PHP 代码:

protoc --php_out=. message.proto

这将生成一个 PHP 文件,通常名为 Message/Message.php,其中包含定义的消息类。

4. 使用生成的 PHP 类

4.1 引入生成的类

在您的 PHP 文件中引入生成的类并使用它:

<?php
require 'vendor/autoload.php'; // 引入 Composer 自动加载

// 引入生成的消息类
use Message\Person;

// 创建一个 Person 实例
$person = new Person();
$person->setName("John Doe");
$person->setId(123);
$person->setEmail("john.doe@example.com");

// 序列化
$serializedData = $person->serializeToString();

// 反序列化
$newPerson = new Person();
$newPerson->mergeFromString($serializedData);

// 输出反序列化的结果
echo "Name: " . $newPerson->getName() . "\n";
echo "ID: " . $newPerson->getId() . "\n";
echo "Email: " . $newPerson->getEmail() . "\n";
?>

4.2 示例解释

  • 设置字段:使用 setNamesetIdsetEmail 方法设置字段值。
  • 序列化:使用 serializeToString 方法将对象序列化为字符串。
  • 反序列化:使用 mergeFromString 方法从字符串恢复对象。

5. 安装和使用示例

5.1 完整示例

以下是一个完整的示例,包括定义、编译和使用 Protocol Buffers。

  1. 创建 message.proto 文件

    syntax = "proto3";
    
    message Person {
        string name = 1;
        int32 id = 2;
        string email = 3;
    }
  2. 编译

    protoc --php_out=. message.proto
  3. 创建 example.php 文件

    <?php
    require 'vendor/autoload.php'; // 引入 Composer 自动加载
    
    use Message\Person;
    
    // 创建并设置数据
    $person = new Person();
    $person->setName("Alice");
    $person->setId(456);
    $person->setEmail("alice@example.com");
    
    // 序列化
    $data = $person->serializeToString();
    
    // 反序列化
    $newPerson = new Person();
    $newPerson->mergeFromString($data);
    
    // 输出
    echo "Name: " . $newPerson->getName() . "\n";
    echo "ID: " . $newPerson->getId() . "\n";
    echo "Email: " . $newPerson->getEmail() . "\n";
    ?>
  4. 运行示例

    php example.php

PHP 输出缓冲 — 缓冲区原理

输出缓冲(Output Buffering)是 PHP 中一个强大的功能,允许您控制脚本的输出。它可以提高性能、优化页面内容的发送以及管理HTTP头的发送。下面将详细介绍输出缓冲的原理和使用方法。

1. 输出缓冲的原理

在 PHP 中,当您调用 echoprint 等输出函数时,输出内容通常是直接发送到浏览器的。然而,使用输出缓冲后,输出内容会先被存储在缓冲区中,而不是立即发送。只有在缓冲区被清空或脚本结束时,内容才会发送到浏览器。

1.1 工作流程

  1. 启动缓冲:调用 ob_start() 开启输出缓冲。
  2. 输出内容:使用 echoprint 输出内容,这些内容将被存储在缓冲区中。
  3. 发送输出:调用 ob_end_flush()ob_flush() 来发送缓冲区内容,或在脚本结束时自动发送。

2. 如何使用输出缓冲

2.1 开启输出缓冲

要使用输出缓冲,首先需要调用 ob_start()

ob_start();

2.2 输出内容

使用 echoprint 输出内容:

echo "Hello, World!";

2.3 发送输出

调用 ob_end_flush() 将缓冲区的内容发送到浏览器并关闭缓冲:

ob_end_flush();

2.4 完整示例

<?php
// 开启输出缓冲
ob_start();

// 输出内容
echo "Hello, World!";
echo " This is output buffering in PHP.";

// 发送缓冲区内容并关闭缓冲
ob_end_flush();
?>

3. 输出缓冲的常用函数

  • ob_start():开启输出缓冲。
  • ob_get_contents():获取当前缓冲区的内容。
  • ob_end_flush():发送当前缓冲区内容并关闭缓冲。
  • ob_flush():发送当前缓冲区内容,但不关闭缓冲。
  • ob_clean():清空缓冲区内容,但不发送。

4. 应用场景

4.1 处理 HTTP 头

输出缓冲允许您在发送任何输出之前修改 HTTP 头。这在需要设置 Cookie 或其他头信息时非常有用。

ob_start();
header("Location: http://example.com");
ob_end_flush();

4.2 内容优化

可以在缓冲区中修改输出内容。例如,您可以对输出的 HTML 进行处理或替换某些内容。

ob_start();
echo "<h1>Title</h1>";
$content = ob_get_contents();
$content = str_replace("Title", "New Title", $content);
ob_end_clean();
echo $content;

4.3 性能提升

对于大型页面,输出缓冲可以减少与客户端的交互次数,从而提高性能。

5. 注意事项

  • 内存使用:输出缓冲会占用服务器内存,因此在处理大量数据时要注意。
  • 缓冲区大小:可以通过 ob_start() 的参数设置缓冲区大小。
  • 关闭缓冲:确保在脚本结束时适当地关闭缓冲,以避免意外输出。
">