복붙노트

PHP 문자열의 유니 코드 문자

PHP

PHP 문자열의 유니 코드 문자

이 질문은 당황스럽게 단순 해 보이지만 답을 찾을 수 없었습니다.

PHP는 다음과 같은 C # 코드 줄과 무엇이 비슷합니까?

string str = "\u1000";

이 샘플에서는 "유니 코드 숫자 값"이 16 진수 (10 진수 4096)로 1000 인 단일 유니 코드 문자로 문자열을 만듭니다.

PHP에서 "유니 코드 숫자 값"이 알려진 단일 유니 코드 문자로 문자열을 만들려면 어떻게해야합니까?

해결법

  1. ==============================

    1.JSON은 \ uxxxx 구문을 직접 지원하므로 내 마음에 가장 먼저 오는 것은 다음과 같습니다.

    JSON은 \ uxxxx 구문을 직접 지원하므로 내 마음에 가장 먼저 오는 것은 다음과 같습니다.

    $unicodeChar = '\u1000';
    echo json_decode('"'.$unicodeChar.'"');
    

    또 다른 옵션은 mb_convert_encoding ()을 사용하는 것입니다.

    echo mb_convert_encoding('က', 'UTF-8', 'HTML-ENTITIES');
    

    UTF-16BE (빅 엔디안)와 유니 코드 코드 포인트 간의 직접 맵핑을 사용하십시오.

    echo mb_convert_encoding("\x10\x00", 'UTF-8', 'UTF-16BE');
    
  2. ==============================

    2.PHP 7.0.0은 "유니 코드 코드 포인트 이스케이프"구문을 도입했습니다.

    PHP 7.0.0은 "유니 코드 코드 포인트 이스케이프"구문을 도입했습니다.

    이제 함수를 호출하지 않고 큰 따옴표 나 heredoc 문자열을 사용하여 유니 코드 문자를 쉽게 작성할 수 있습니다.

    $unicodeChar = "\u{1000}";
    
  3. ==============================

    3.PHP는 이러한 유니 코드 이스케이프 시퀀스를 알지 못합니다. 그러나 알 수없는 이스케이프 시퀀스는 영향을받지 않으므로 이러한 유니 코드 이스케이프 시퀀스를 변환하는 고유 한 함수를 작성할 수 있습니다.

    PHP는 이러한 유니 코드 이스케이프 시퀀스를 알지 못합니다. 그러나 알 수없는 이스케이프 시퀀스는 영향을받지 않으므로 이러한 유니 코드 이스케이프 시퀀스를 변환하는 고유 한 함수를 작성할 수 있습니다.

    function unicodeString($str, $encoding=null) {
        if (is_null($encoding)) $encoding = ini_get('mbstring.internal_encoding');
        return preg_replace_callback('/\\\\u([0-9a-fA-F]{4})/u', create_function('$match', 'return mb_convert_encoding(pack("H*", $match[1]), '.var_export($encoding, true).', "UTF-16BE");'), $str);
    }
    

    또는 create_function 대신 익명 함수 식을 사용합니다.

    function unicodeString($str, $encoding=null) {
        if (is_null($encoding)) $encoding = ini_get('mbstring.internal_encoding');
        return preg_replace_callback('/\\\\u([0-9a-fA-F]{4})/u', function($match) use ($encoding) {
            return mb_convert_encoding(pack('H*', $match[1]), $encoding, 'UTF-16BE');
        }, $str);
    }
    

    사용법 :

    $str = unicodeString("\u1000");
    
  4. ==============================

    4.왜 아무도 이것을 아직 언급하지 않은 이유가 궁금하지만 이중 따옴표로 묶은 문자열에서 이스케이프 시퀀스를 사용하여 거의 동일한 버전을 수행 할 수 있습니다.

    왜 아무도 이것을 아직 언급하지 않은 이유가 궁금하지만 이중 따옴표로 묶은 문자열에서 이스케이프 시퀀스를 사용하여 거의 동일한 버전을 수행 할 수 있습니다.

    ASCII 예제 :

    <?php
        echo("\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x21");
    ?>
    

    따라서 귀하의 경우에 필요한 것은 $ str = "\ x30 \ xA2";입니다. 그러나 이들은 바이트가 아니라 문자가 아닙니다. 유니 코드 코드 포인트의 바이트 표현은 UTF-16 빅 엔디안과 일치하므로 다음과 같이 직접 인쇄 할 수 있습니다.

    <?php
        header('content-type:text/html;charset=utf-16be');
        echo("\x30\xA2");
    ?>
    

    다른 인코딩을 사용하는 경우 바이트를 적절하게 변경해야합니다 (대부분 손으로 가능하지만 라이브러리로 대부분 처리됩니다).

    UTF-16 little endian 예제 :

    <?php
        header('content-type:text/html;charset=utf-16le');
        echo("\xA2\x30");
    ?>
    

    UTF-8 예제 :

    <?php
        header('content-type:text/html;charset=utf-8');
        echo("\xE3\x82\xA2");
    ?>
    

    팩 기능도 있지만 속도가 느릴 것으로 예상 할 수 있습니다.

  5. ==============================

    5.

    html_entity_decode('&#x30a8;', 0, 'UTF-8');
    

    이것도 작동합니다. 그러나 json_decode () 솔루션은 훨씬 더 빠릅니다 (약 50 회).

  6. ==============================

    6.Portable UTF-8을 사용해보십시오.

    Portable UTF-8을 사용해보십시오.

    $str = utf8_chr( 0x1000 );
    $str = utf8_chr( '\u1000' );
    $str = utf8_chr( 4096 );
    

    모두 똑같은 방식으로 작동합니다. utf8_ord ()로 문자의 코드 포인트를 얻을 수 있습니다. Portable UTF-8에 대해 자세히 읽어보십시오.

  7. ==============================

    7.다른 사람들이 언급했듯이, PHP 7은 \ 유니 코드 구문을 직접 지원합니다.

    다른 사람들이 언급했듯이, PHP 7은 \ 유니 코드 구문을 직접 지원합니다.

    또한 다른 사람들이 언급했듯이 PHP에서 의미있는 유니 코드 문자 설명에서 문자열 값을 얻는 유일한 방법은 다른 것으로 변환하는 것입니다 (예 : JSON 구문 분석, HTML 구문 분석 또는 다른 형식). 그러나 이것은 런타임 성능 비용으로 발생합니다.

    그러나 다른 옵션이 있습니다. \ x 바이너리 이스케이프를 사용하여 PHP에서 직접 캐릭터를 인코딩 할 수 있습니다. \ x 이스케이프 구문은 PHP 5에서도 지원됩니다.

    이것은 자연스러운 형식을 통해 문자열에 문자를 직접 입력하지 않으려는 경우 특히 유용합니다. 예를 들어 보이지 않는 제어 문자이거나 공백을 감지하기 어려운 기타 문자 일 경우

    첫째, 증명 예 :

    // Unicode Character 'HAIR SPACE' (U+200A)
    $htmlEntityChar = "&#8202;";
    $realChar = html_entity_decode($htmlEntityChar);
    $phpChar = "\xE2\x80\x8A";
    echo 'Proof: ';
    var_dump($realChar === $phpChar); // bool(true)
    

    Pacerier가 다른 대답에서 언급했듯이이 바이너리 코드는 특정 문자 인코딩에 고유합니다. 위의 예에서 \ xE2 \ x80 \ x8A는 UTF-8의 U + 200A에 대한 2 진 코드입니다.

    다음 질문은 U + 200A에서 \ xE2 \ x80 \ x8A까지 어떻게 얻습니까?

    다음은 JSON 문자열, HTML 엔터티 또는 네이티브 문자열로 가져온 다른 메서드를 기반으로 모든 문자에 대한 이스케이프 시퀀스를 생성하는 PHP 스크립트입니다.

    function str_encode_utf8binary($str) {
        /** @author Krinkle 2018 */
        $output = '';
        foreach (str_split($str) as $octet) {
            $ordInt = ord($octet);
            // Convert from int (base 10) to hex (base 16), for PHP \x syntax
            $ordHex = base_convert($ordInt, 10, 16);
            $output .= '\x' . $ordHex;
        }
        return $output;
    }
    
    function str_convert_html_to_utf8binary($str) {
        return str_encode_utf8binary(html_entity_decode($str));
    }
    function str_convert_json_to_utf8binary($str) {
        return str_encode_utf8binary(json_decode($str));
    }
    
    // Example for raw string: Unicode Character 'INFINITY' (U+221E)
    echo str_encode_utf8binary('∞') . "\n";
    // \xe2\x88\x9e
    
    // Example for HTML: Unicode Character 'HAIR SPACE' (U+200A)
    echo str_convert_html_to_utf8binary('&#8202;') . "\n";
    // \xe2\x80\x8a
    
    // Example for JSON: Unicode Character 'HAIR SPACE' (U+200A)
    echo str_convert_json_to_utf8binary('"\u200a"') . "\n";
    // \xe2\x80\x8a
    
  8. from https://stackoverflow.com/questions/6058394/unicode-character-in-php-string by cc-by-sa and MIT license