PHP 문자열의 유니 코드 문자
이 질문은 당혹스럽게 간단 해 보이지만 답을 찾을 수 없었습니다.
다음 C # 코드 라인과 동등한 PHP는 무엇입니까?
string str = "\u1000";
이 샘플은 "유니 코드 숫자 값"이 16 진수로 1000 (10 진수 4096) 인 단일 유니 코드 문자로 문자열을 만듭니다.
즉, PHP에서 "유니 코드 숫자 값"이 알려진 단일 유니 코드 문자로 문자열을 어떻게 만들 수 있습니까?
JSON이 \uxxxx
구문을 직접 지원하기 때문에 가장 먼저 생각하는 것은 다음과 같습니다.
$unicodeChar = '\u1000';
echo json_decode('"'.$unicodeChar.'"');
다른 옵션은 사용하는 것입니다 mb_convert_encoding()
echo mb_convert_encoding('က', 'UTF-8', 'HTML-ENTITIES');
또는 UTF-16BE (big endian)와 유니 코드 코드 포인트 간의 직접 매핑을 사용하십시오.
echo mb_convert_encoding("\x10\x00", 'UTF-8', 'UTF-16BE');
PHP 7.0.0은 "유니 코드 코드 포인트 이스케이프"구문을 도입했습니다 .
이제 함수를 호출하지 않고 큰 따옴표 나 heredoc 문자열 을 사용하여 유니 코드 문자를 쉽게 작성할 수 있습니다.
$unicodeChar = "\u{1000}";
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");
아무도 아직 이것을 언급하지 않은 이유가 궁금하지만 큰 따옴표로 묶은 문자열 에서 이스케이프 시퀀스를 사용하여 거의 동등한 버전을 수행 할 수 있습니다 .
\x[0-9A-Fa-f]{1,2}
정규식과 일치하는 문자 시퀀스는 16 진 표기법의 문자입니다.
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 리틀 엔디안 예제 :
<?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");
?>
ア
pack
기능 도 있지만 속도가 느릴 것으로 예상 할 수 있습니다.
html_entity_decode('エ', 0, 'UTF-8');
이것도 작동합니다. 그러나 json_decode () 솔루션은 훨씬 더 빠릅니다 (약 50 배).
휴대용 UTF-8을 사용해보십시오 :
$str = utf8_chr( 0x1000 );
$str = utf8_chr( '\u1000' );
$str = utf8_chr( 4096 );
모두 정확히 같은 방식으로 작동합니다. 로 캐릭터의 코드 포인트를 얻을 수 있습니다 utf8_ord()
. 휴대용 UTF-8에 대해 자세히 알아보십시오 .
As mentioned by others, PHP 7 introduces support for the \u
Unicode syntax directly.
As also mentioned by others, the only way to obtain a string value from any sensible Unicode character description in PHP, is by converting it from something else (e.g. JSON parsing, HTML parsing or some other form). But this comes at a run-time performance cost.
However, there is one other option. You can encode the character directly in PHP with \x
binary escaping. The \x
escape syntax is also supported in PHP 5.
This is especially useful if you prefer not to enter the character directly in a string through its natural form. For example, if it is an invisible control character, or other hard to detect whitespace.
First, a proof example:
// Unicode Character 'HAIR SPACE' (U+200A)
$htmlEntityChar = " ";
$realChar = html_entity_decode($htmlEntityChar);
$phpChar = "\xE2\x80\x8A";
echo 'Proof: ';
var_dump($realChar === $phpChar); // bool(true)
Note that, as mentioned by Pacerier in another answer, this binary code is unique to a specific character encoding. In the above example, \xE2\x80\x8A
is the binary coding for U+200A in UTF-8.
The next question is, how do you get from U+200A
to \xE2\x80\x8A
?
Below is a PHP script to generate the escape sequence for any character, based on either a JSON string, HTML entity, or any other method once you have it as a native string.
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(' ') . "\n";
// \xe2\x80\x8a
// Example for JSON: Unicode Character 'HAIR SPACE' (U+200A)
echo str_convert_json_to_utf8binary('"\u200a"') . "\n";
// \xe2\x80\x8a
참고URL : https://stackoverflow.com/questions/6058394/unicode-character-in-php-string
'Programing' 카테고리의 다른 글
안드로이드에서 여러 줄 TextView? (0) | 2020.06.18 |
---|---|
WcfTestClient.exe를 찾을 수있는 곳 (Visual Studio의 일부) (0) | 2020.06.18 |
목록의 마지막 항목을 제외한 모든 항목을 반복하는 방법은 무엇입니까? (0) | 2020.06.18 |
“Nonatomic”속성은 무엇을 의미합니까? (0) | 2020.06.18 |
DLL 종속성을 확인하는 방법? (0) | 2020.06.18 |