繁体   English   中英

Json_encode字符集问题

[英]Json_encode Charset problem

当我使用json_encode编码我的多语言字符串时,它还会更改特殊字符。我应该怎么做才能保持它们不变。

例如

<?
echo json_encode(array('şüğçö'));

它返回类似[“ \\ u015f \\ u00fc \\ u011f \\ u00e7 \\ u00f6”的内容

但我想要[“şüğçö”]

试试吧:

<?
echo json_encode(array('şüğçö'), JSON_UNESCAPED_UNICODE);

在JSON中,字符串中的任何字符都可以用Unicode转义序列表示。 因此, "\ş\ü\ğ\ç\ö"在语义上等于"şüğçö"

尽管这些字符也可以简单地使用,但是json_encode可能更喜欢Unicode转义序列以避免字符编码问题。

  • 你不应该这样
  • 即使没有PHP 5.4,这绝对有可能。

首先,使用json_encode()对字符串进行编码并将其保存在变量中。

然后,只需使用preg_replace()再次将所有\\ uxxxx替换为unicode。

json_encode()没有提供任何选项来选择5.4之前版本中的编码字符集。

PHP 5.4添加了选项JSON_UNESCAPED_UNICODE ,它JSON_UNESCAPED_UNICODE您的需求。 请注意, json_encode始终输出UTF-8。

<?php

print_r(json_decode(json_encode(array('şüğçö'))));

/*
Array
(   
    [0] => şüğçö
)
*/

那么,您是否真的需要使这些字符在JSON中不转义?

用于PHP 5.3.3的 Json_encode字符集解决方案

由于JSON_UNESCAPED_UNICODE在PHP 5.3.3中不起作用,因此我们使用了此方法,并且该方法正在起作用。

$data = array(
        'text' => 'Päiväkampanjat'
);
$json_encode = json_encode($data);
var_dump($json_encode); // text: "P\u00e4iv\u00e4kampanjat"

$unescaped_data = preg_replace_callback('/\\\\u(\w{4})/', function ($matches) {
    return html_entity_decode('&#x' . $matches[1] . ';', ENT_COMPAT, 'UTF-8');
}, $json_encode);

var_dump($unescaped); // text is unescaped -> Päiväkampanjat

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM