"\u00ed"와 같은 Unicode 이스케이프 시퀀스를 적절한 UTF-8 인코딩 문자로 디코딩하려면 어떻게 해야 합니까?
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);
print_r(json_decode('{"t":"\u00ed"}')); // -> stdClass Object ( [t] => í )
PHP 7+
PHP 7부터는 Unicode 코드 포인트 이스케이프 구문을 사용하여 이를 수행할 수 있습니다.
echo "\u{00ed}";
출력í
.
$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);
}
이것은 원시 UNICODE를 HTML로 대체하기 위한 중대한 접근법입니다.다른 곳에서 이 솔루션을 도입하는 것은 본 적이 없지만, 다른 곳에서는 이 문제가 있었던 것 같습니다.
다른 작업을 수행하기 전에 이 str_replace 함수를 RAW JSON에 적용하십시오.
function unicode2html($str){
$i=65535;
while($i>0){
$hex=dechex($i);
$str=str_replace("\u$hex","&#$i;",$str);
$i--;
}
return $str;
}
이것은 당신이 생각하는 것만큼 오래 걸리지 않을 것이고, 이것은 어떤 유니코드도 HTML로 대체할 것입니다.
물론 JSON에서 반환되는 Unicode 유형을 알고 있으면 이 값을 줄일 수 있습니다.
예를 들어, 제 코드는 많은 화살표와 딩뱃 유니코드를 받는 것이었습니다.8448에서 11263 사이입니다.생산 코드는 다음과 같습니다.
$i=11263;
while($i>08448){
...etc...
유니코드 블록은 여기서 종류별로 검색할 수 있습니다.http://unicode-table.com/en/ 아랍어나 텔레구어 등을 번역하고 있는 것을 알고 있다면 65,000개의 코드를 모두 치환할 수는 없습니다.
단순한 부호화에도 같은 해머를 적용할 수 있습니다.
$str=str_replace("\u$hex",chr($i),$str);
해결책도 있습니다.
http://www.welefen.com/php-unicode-to-utf8.html
function entity2utf8onechar($unicode_c){
$unicode_c_val = intval($unicode_c);
$f=0x80; // 10000000
$str = "";
// U-00000000 - U-0000007F: 0xxxxxxx
if($unicode_c_val <= 0x7F){ $str = chr($unicode_c_val); } //U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
else if($unicode_c_val >= 0x80 && $unicode_c_val <= 0x7FF){ $h=0xC0; // 11000000
$c1 = $unicode_c_val >> 6 | $h;
$c2 = ($unicode_c_val & 0x3F) | $f;
$str = chr($c1).chr($c2);
} else if($unicode_c_val >= 0x800 && $unicode_c_val <= 0xFFFF){ $h=0xE0; // 11100000
$c1 = $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
else if($unicode_c_val >= 0x10000 && $unicode_c_val <= 0x1FFFFF){ $h=0xF0; // 11110000
$c1 = $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: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
else if($unicode_c_val >= 0x200000 && $unicode_c_val <= 0x3FFFFFF){ $h=0xF8; // 11111000
$c1 = $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 10xxxxxx
else if($unicode_c_val >= 0x4000000 && $unicode_c_val <= 0x7FFFFFFF){ $h=0xFC; // 11111100
$c1 = $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);
}
return $str;
}
function entities2utf8($unicode_c){
$unicode_c = preg_replace("/\&\#([\da-f]{5})\;/es", "entity2utf8onechar('\\1')", $unicode_c);
return $unicode_c;
}
json 값을 수정하고 u{xx} 전에 모든 +"에 \를 추가합니다.
$item = preg_replace_callback('/"(.+?)":"(u.+?)",/', function ($matches) {
$matches[2] = preg_replace('/(u)/', '\u', $matches[2]);
$matches[2] = preg_replace('/(")/', '"', $matches[2]);
$matches[2] = json_decode('"' . $matches[2] . '"');
return '"' . $matches[1] . '":"' . $matches[2] . '",';
}, $item);
언급URL : https://stackoverflow.com/questions/2934563/how-to-decode-unicode-escape-sequences-like-u00ed-to-proper-utf-8-encoded-cha
'source' 카테고리의 다른 글
ipython의 모든 경고 숨기기 (0) | 2022.09.24 |
---|---|
PHP의 session_unset()과 session_destroy()의 차이점은 무엇입니까? (0) | 2022.09.24 |
Java 언어로 미화된 클래스 (0) | 2022.09.24 |
VueJ + Vuex에서 여러 웹 소켓 엔드포인트를 처리하는 방법 (0) | 2022.09.24 |
해당 함수 내에서 함수 이름을 얻는 방법은 무엇입니까? (0) | 2022.09.24 |