Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何解码Unicode转义序列,如\u00ed“;正确的UTF-8编码字符?_Php_Unicode_Utf 8_Escaping_Decoding - Fatal编程技术网

Php 如何解码Unicode转义序列,如\u00ed“;正确的UTF-8编码字符?

Php 如何解码Unicode转义序列,如\u00ed“;正确的UTF-8编码字符?,php,unicode,utf-8,escaping,decoding,Php,Unicode,Utf 8,Escaping,Decoding,PHP中是否有一个函数可以将Unicode转义序列(如“\u00ed”解码为“í”)以及所有其他类似事件 我发现了类似的问题,但它似乎不起作用。试试这个: $str = preg_replace_callback('/\\\\u([0-9a-fA-F]{4})/', function ($match) { return mb_convert_encoding(pack('H*', $match[1]), 'UTF-8', 'UCS-2BE'); }, $str); 如果是基于UTF-1

PHP中是否有一个函数可以将Unicode转义序列(如“
\u00ed
”解码为“
í
”)以及所有其他类似事件

我发现了类似的问题,但它似乎不起作用。

试试这个:

$str = preg_replace_callback('/\\\\u([0-9a-fA-F]{4})/', function ($match) {
    return mb_convert_encoding(pack('H*', $match[1]), 'UTF-8', 'UCS-2BE');
}, $str);
如果是基于UTF-16的C/C++/Java/Json样式:

$str = preg_replace_callback('/\\\\u([0-9a-fA-F]{4})/', function ($match) {
    return mb_convert_encoding(pack('H*', $match[1]), 'UTF-8', 'UTF-16BE');
}, $str);

还有一个解决方案:

函数entity2utf8onechar($unicode\u c){
$unicode_c_val=intval($unicode_c);
$f=0x80;//10000000
$str=”“;
//U-00000000-U-0000007F:0xxxxxxx
如果($unicode_c_val=0x80&&$unicode_c_val>6 |$h;
$c2=($unicode_c_val&0x3F)|$f;
$str=chr($c1)。chr($c2);
}如果($unicode_c_val>=0x800&&$unicode_c_val>12 |$h;
$c2=($unicode_c_val&0xFC0)>>6)|$f;
$c3=($unicode_c_val&0x3F)|$f;
$str=chr($c1)、chr($c2)、chr($c3);
}
//U-00010000-U-001FFFFF:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
如果($unicode_c_val>=0x10000&&$unicode_c_val>18 |$h;
$c2=($unicode_c_val&0x3F000)>>12)|$f;
$c3=($unicode_c_val&0xFC0)>>6)|$f;
$c4=($unicode_c_val&0x3F)|$f;
$str=chr($c1)、chr($c2)、chr($c3)、chr($c4);
}
//U-00200000-U-03FFFFFF:11111 0xX 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
如果($unicode_c_val>=0x200000&&$unicode_c_val>24 |$h;
$c2=($unicode_c_val&0xFC0000)>>18)|$f;
$c3=($unicode_c_val&0x3F000)>>12)|$f;
$c4=($unicode_c_val&0xFC0)>>6)|$f;
$c5=($unicode_c_val&0x3F)|$f;
$str=chr($c1)、chr($c2)、chr($c3)、chr($c4)、chr($c5);
}
//U-04000000-U-7FFFFFFF:1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
如果($unicode_c_val>=0x4000000&&$unicode_c_val>30 |$h;
$c2=($unicode_c_val&0x3F000000)>>24)|$f;
$c3=($unicode_c_val&0xFC0000)>>18)|$f;
$c4=($unicode_c_val&0x3F000)>>12)|$f;
$c5=($unicode_c_val&0xFC0)>>6)|$f;
$c6=($unicode_c_val&0x3F)|$f;
$str=chr($c1)、chr($c2)、chr($c3)、chr($c4)、chr($c5)、chr($c6);
}
返回$str;
}
函数实体2UTF8($unicode_c){
$unicode_c=preg_replace(“/\&\”([\da-f]{5})\/es)、“entity2utf8onechar('\\1')”、$unicode#c);
返回$unicode_c;
}
$str='\u0063\u0061\u0074'.\ud83d\ude38';
$str2='\u0063\u0061\u0074'.\ud83d';
//U+1F638
瓦鲁垃圾场(
“cat\xF0\x9F\x98\xB8”==escape\u sequence\u decode($str),
“cat\xEF\xBF\xBD”==escape\u sequence\u decode($str2)
);
函数转义\序列\解码($str){
//[U+D800-U+DBFF][U+DC00-U+DFFF]|[U+0000-U+FFFF]
$regex='/\\\u([dD][89abAB][\da-fA-F]{2})\\\u([dD][c-fC-F][\da-fA-F]{2})
|\\\u([\da-fA-F]{4})/sx';
返回preg_replace_回调($regex,function($matches){
如果(isset($matches[3])){
$cp=hexdec($matches[3]);
}否则{
$lead=hexdec($matches[1]);
$trail=hexdec($matches[2]);
// http://unicode.org/faq/utf_bom.html#utf16-4
$cp=($lead$cp){
$cp=0xFFFD;
}
// https://github.com/php/php-src/blob/php-5.6.4/ext/standard/html.c#L471
//php_utf32_utf8(无符号字符*buf,无符号k)
如果($cp<0x80){
返回chr($cp);
}否则如果($cp<0xA0){
返回chr(0xC0 |$cp>>6).chr(0x80 |$cp&0x3F);
}
返回html_entity_decode('&#'.$cp.'');
}美元/平方米);
}

这是一个用HTML替换原始UNICODE的大锤式方法。我还没有看到任何其他地方可以放置此解决方案,但我认为其他人也有此问题

在执行任何操作之前,将此str_replace函数应用于原始JSON 否则

这不会花你想象的那么长时间,这将用HTML取代任何unicode

当然,如果您知道JSON中返回的unicode类型,那么这可以减少

例如,我的代码得到了很多箭头和unicode。 它们介于8448和11263之间。因此,我的生产代码如下所示:

$i=11263;
while($i>08448){
    ...etc...
您可以在此处按类型查找Unicode块: 如果你知道你在翻译阿拉伯语或Telegu或其他什么,你可以直接替换那些代码,而不是全部65000

您可以将同样的大锤应用于简单编码:

 $str=str_replace("\u$hex",chr($i),$str);
修复json值, 它是在u{xxx}之前添加\到all+“”

PHP7+ 从PHP7开始,您可以使用


echo“\u{00ed}”
输出
i

@Docstero:正则表达式将匹配任何后跟四个十六进制数字的
\u
序列。警告:preg\u replace\u callback()[function.preg replace callback]:编译失败:PCRE不支持偏移量1处的\L、\L、\N、\U或\U此函数无法处理补充字符,因为它们不能在UCS-2中表示。@gumbo如何调用或使用此函数?我在这里找到了我的方法,就像我在输出中\u00ed一样,但我正在使用json\U encode()查看输出有趣的是,默认的json_encode()会破坏输出,所以使用json_encode($theDict,json_PRETTY_PRINT | json_UNESCAPED_UNICODE);它甚至不需要对象包装:
json_decode(“.$text.”)
谢谢。这似乎是标准的方式,而不是公认的答案。有趣的是,这也适用于复杂的实体,如笑脸…
json_decode(“{”t:“\uD83D\uDE0A”}”)
是@deceze,你应该包括这样一个事实,
$text
可以包含双引号。因此,修订版应该是:
json_decode('“'.str\u replace(''”、'\\'、$text)。”)
。感谢您的帮助:-)谢谢!比其他答案简单得多谢谢。这似乎适用于补充字符,例如

$str = '\u0063\u0061\u0074'.'\ud83d\ude38';
$str2 = '\u0063\u0061\u0074'.'\ud83d';

// U+1F638
var_dump(
    "cat\xF0\x9F\x98\xB8" === escape_sequence_decode($str),
    "cat\xEF\xBF\xBD" === escape_sequence_decode($str2)
);

function escape_sequence_decode($str) {

    // [U+D800 - U+DBFF][U+DC00 - U+DFFF]|[U+0000 - U+FFFF]
    $regex = '/\\\u([dD][89abAB][\da-fA-F]{2})\\\u([dD][c-fC-F][\da-fA-F]{2})
              |\\\u([\da-fA-F]{4})/sx';

    return preg_replace_callback($regex, function($matches) {

        if (isset($matches[3])) {
            $cp = hexdec($matches[3]);
        } else {
            $lead = hexdec($matches[1]);
            $trail = hexdec($matches[2]);

            // http://unicode.org/faq/utf_bom.html#utf16-4
            $cp = ($lead << 10) + $trail + 0x10000 - (0xD800 << 10) - 0xDC00;
        }

        // https://tools.ietf.org/html/rfc3629#section-3
        // Characters between U+D800 and U+DFFF are not allowed in UTF-8
        if ($cp > 0xD7FF && 0xE000 > $cp) {
            $cp = 0xFFFD;
        }

        // https://github.com/php/php-src/blob/php-5.6.4/ext/standard/html.c#L471
        // php_utf32_utf8(unsigned char *buf, unsigned k)

        if ($cp < 0x80) {
            return chr($cp);
        } else if ($cp < 0xA0) {
            return chr(0xC0 | $cp >> 6).chr(0x80 | $cp & 0x3F);
        }

        return html_entity_decode('&#'.$cp.';');
    }, $str);
}
function unicode2html($str){
    $i=65535;
    while($i>0){
        $hex=dechex($i);
        $str=str_replace("\u$hex","&#$i;",$str);
        $i--;
     }
     return $str;
}
$i=11263;
while($i>08448){
    ...etc...
 $str=str_replace("\u$hex",chr($i),$str);
  $item = preg_replace_callback('/"(.+?)":"(u.+?)",/', function ($matches) {
        $matches[2] = preg_replace('/(u)/', '\u', $matches[2]);
            $matches[2] = preg_replace('/(")/', '&quot;', $matches[2]); 
            $matches[2] = json_decode('"' . $matches[2] . '"'); 
            return '"' . $matches[1] . '":"' . $matches[2] . '",';
        }, $item);