<?php
$string = '👶🏻';
echo '=== UTF-8 =============================', PHP_EOL;
echo 'STRING: ', $string, PHP_EOL;
echo 'CHARACTERS: ', mb_strlen($string), PHP_EOL; // 2
echo 'BYTE COUNT: ', strlen($string), PHP_EOL; // 8
foreach(range(0, mb_strlen($string) - 1) as $index) {
echo PHP_EOL;
echo 'CHARACTER #', $index + 1, ' CODE POINT: ', '0x', dechex(mb_ord(mb_substr($string, $index, 1))), PHP_EOL; // [0x1f476, 0x1f3fb]
echo 'CHARACTER #', $index + 1, ' BYTE COUNT: ', mb_strlen(mb_substr($string, $index, 1), '8bit'), PHP_EOL; // [4, 4]
}
echo '=======================================', PHP_EOL, PHP_EOL;
$string = mb_convert_encoding($string, 'UTF-16', 'UTF-8');
echo '=== UTF-16 ============================', PHP_EOL;
echo 'STRING: ', $string, PHP_EOL;
echo 'CHARACTERS: ', mb_strlen($string), PHP_EOL; // should be 2, is 4
echo 'BYTE COUNT: ', strlen($string), PHP_EOL; // should be 8, is 8
foreach(range(0, mb_strlen($string) - 1) as $index) {
echo PHP_EOL;
echo 'CHARACTER #', $index + 1, ' CODE POINT: ', '0x', dechex(mb_ord(mb_substr($string, $index, 1))), PHP_EOL; // should be [0x1f476, 0x1f3fb], is [0x0, 0x0, 0x0, 0x0]
echo 'CHARACTER #', $index + 1, ' BYTE COUNT: ', mb_strlen(mb_substr($string, $index, 1), '8bit'), PHP_EOL; // should be [4, 4], is [2, 2, 2, 2]
}
echo '=======================================', PHP_EOL;
- Output for 8.3.2 - 8.3.25, 8.4.1 - 8.4.12
- === UTF-8 =============================
STRING: 👶🏻
CHARACTERS: 2
BYTE COUNT: 8
CHARACTER #1 CODE POINT: 0x1f476
CHARACTER #1 BYTE COUNT: 4
CHARACTER #2 CODE POINT: 0x1f3fb
CHARACTER #2 BYTE COUNT: 4
=======================================
=== UTF-16 ============================
STRING: �=�v�<�
CHARACTERS: 8
BYTE COUNT: 8
CHARACTER #1 CODE POINT: 0x3f
CHARACTER #1 BYTE COUNT: 1
CHARACTER #2 CODE POINT: 0x3d
CHARACTER #2 BYTE COUNT: 1
CHARACTER #3 CODE POINT: 0x3f
CHARACTER #3 BYTE COUNT: 1
CHARACTER #4 CODE POINT: 0x76
CHARACTER #4 BYTE COUNT: 1
CHARACTER #5 CODE POINT: 0x3f
CHARACTER #5 BYTE COUNT: 1
CHARACTER #6 CODE POINT: 0x3c
CHARACTER #6 BYTE COUNT: 1
CHARACTER #7 CODE POINT: 0x3f
CHARACTER #7 BYTE COUNT: 1
CHARACTER #8 CODE POINT: 0x3f
CHARACTER #8 BYTE COUNT: 1
=======================================
- Output for 8.3.0 - 8.3.1
- === UTF-8 =============================
STRING: 👶🏻
CHARACTERS: 2
BYTE COUNT: 8
CHARACTER #1 CODE POINT: 0x1f476
CHARACTER #1 BYTE COUNT: 4
CHARACTER #2 CODE POINT: 0x1f3fb
CHARACTER #2 BYTE COUNT: 4
=======================================
=== UTF-16 ============================
STRING: �=�v�<�
CHARACTERS: 8
BYTE COUNT: 8
CHARACTER #1 CODE POINT: 0x0
CHARACTER #1 BYTE COUNT: 2
CHARACTER #2 CODE POINT: 0x0
CHARACTER #2 BYTE COUNT: 2
CHARACTER #3 CODE POINT: 0x0
CHARACTER #3 BYTE COUNT: 2
CHARACTER #4 CODE POINT: 0x0
CHARACTER #4 BYTE COUNT: 2
CHARACTER #5 CODE POINT: 0x
Fatal error: Uncaught ValueError: mb_ord(): Argument #1 ($string) must not be empty in /in/acOTR:26
Stack trace:
#0 /in/acOTR(26): mb_ord('')
#1 {main}
thrown in /in/acOTR on line 26
Process exited with code 255. - Output for 7.2.0 - 7.2.33, 7.3.0 - 7.3.33, 7.4.0 - 7.4.33, 8.0.0 - 8.0.30, 8.1.0 - 8.1.33, 8.2.0 - 8.2.29
- === UTF-8 =============================
STRING: 👶🏻
CHARACTERS: 2
BYTE COUNT: 8
CHARACTER #1 CODE POINT: 0x1f476
CHARACTER #1 BYTE COUNT: 4
CHARACTER #2 CODE POINT: 0x1f3fb
CHARACTER #2 BYTE COUNT: 4
=======================================
=== UTF-16 ============================
STRING: �=�v�<�
CHARACTERS: 4
BYTE COUNT: 8
CHARACTER #1 CODE POINT: 0x0
CHARACTER #1 BYTE COUNT: 2
CHARACTER #2 CODE POINT: 0x0
CHARACTER #2 BYTE COUNT: 2
CHARACTER #3 CODE POINT: 0x0
CHARACTER #3 BYTE COUNT: 2
CHARACTER #4 CODE POINT: 0x0
CHARACTER #4 BYTE COUNT: 2
=======================================
preferences:
146.84 ms | 412 KiB | 5 Q