2016-08-30 4 views
1

iOS 앱에서 채팅을 보낼 때 응용 프로그램을 만들고 있지만 관리자가 PHP로 작성된 관리자 패널에서 채팅을 볼 수 있습니다. DB에서 PHP에서 UTF16 서로 게이트 쌍을 동등한 HEX 코드 포인트로 변환하는 방법은 무엇입니까?

는,이 같은 채팅 메시지를 받고있을 것이다 : 나는 이미지로 HEX 코드 포인트를 변환 할 수있는 library을 twemoji 사용하고

Hi, Jax\ud83d\ude1b\ud83d\ude44! can we go for a coffee? 

. 나는 다음 코드 한

의 상세 가정 해 봅시다

, PHP 섹션에서

는 : -

$text = "This is fun \u1f602! \u1f1e8 "; 
$html = preg_replace("/\\\\u([0-9A-F]{2,5})/i", "&#x$1;", $text); 
echo $html; 

는 이제 twemoji 이미지에 진수 코드 포인트를 대체하는 HTML 문서의 몸 전체를 구문 분석합니다.

window.onload = function() { 

    // Set the size of the rendered Emojis 
    // This can be set to 16x16, 36x36, or 72x72 
    twemoji.size = '16x16'; 

    // Parse the document body and 
    // insert <img> tags in place of Unicode Emojis 
    twemoji.parse(document.body); 
} 

그렇기 때문에 모든 UTF-16을 16 진수 코드 포인트 (예 : emojis)로 바꾸려면 텍스트가 필요합니다. 어떻게해야합니까? 여기

답변

0

당신은 이중 문제가 있습니다

  • 실제로 변환 인코딩 된 서로 게이트 쌍가 있다는 것을 감지를 그 문제의 복잡성을 설명하는 HTML 엔티티

에 서로 게이트 쌍 (UTF-16에서 이것을 읽어야 만하는) 단일 답변의 범위를 벗어납니다. 그러나이 코드 조각은 문제를 해결하는 것으로 보입니다.

$text = "Hi, Jax\\ud83d\\ude1b\\ud83d\\ude44! can we go for a coffee?"; 

$result = preg_replace_callback('/\\\\u(d[89ab][0-9a-f]{2})\\\\u(d[c-f][0-9a-f]{2})/i', function ($matches) { 
    $first = $matches[1]; 
    $second = $matches[2]; 
    $value = ((eval("return 0x$first;") & 0x3ff) << 10) | (eval("return 0x$second;") & 0x3ff); 
    $value += 0x10000; 
    return "&#$value;"; 
    }, $text); 

echo $result; 

나는 eval을 사용하는 것이 거의 항상 권장되지만 정규 표현식 일치 때문에이 예제에서 완벽하게 안전하다는 것을 알고 있습니다 (일치하는 경우 16 진수 만 포함).

+0

남자는 반드시 매력이었습니다 ... 그러나 변환되지 않은 일부 쌍이 있습니다. – Saswat

+0

어떤 페어가 있습니까? 당신은 실제 쌍이고 BMP 코드 포인트가 아니라고 확신합니까? (단순히'\ uNNNN '으로 인코딩되며 두 개가 아닌 하나의 이스케이프 시퀀스로 인코딩됩니다)? 이 경우 필터를 제거하기 위해 다른 정규 표현식 대체품을 사용해야합니다. '\ uNNNN'을'& # xNNNN;'(여기서'NNNN'은 정확하게 4 개의 16 진수)으로 대체하기를 원하기 때문에 이것은 매우 간단합니다. 그리고 그것은 간단한 regex replace로 할 수 있습니다. – aaaaaa123456789

+0

'\ ud83d \ ude43'와 (과) 유사합니다. – Saswat