zend-blog-3-backend
61 строка · 1.5 Кб
1<?php
2
3namespace App\Utils;
4
5use InvalidArgumentException;
6
7/**
8* Class EmojiFlagSymbol
9*
10* Examples:
11* https://emojipedia.org/flags/
12* https://apps.timwhitlock.info/unicode/inspect/hex/1F1F2/1F1E9
13*/
14class EmojiFlagSymbol
15{
16/**
17* The number by which to offset the character code to get the regional indicator
18*
19* @var int
20*/
21private const INDICATOR_OFFSET = 127397;
22
23/**
24* @param string|null $countryCode
25*
26* @return string
27*/
28public static function get(string $countryCode = null): string
29{
30if ($countryCode === '-') {
31// Pirate Flag Emoji
32return hex2bin('F09F8FB4E2808DE298A0EFB88F');
33}
34
35if (is_null($countryCode) || strlen($countryCode) !== 2) {
36throw new InvalidArgumentException('Please provide a 2 character country code.');
37}
38
39$countryCode = strtoupper($countryCode);
40
41return implode(
42'',
43array_map(
44[__CLASS__, 'convertChar'],
45str_split($countryCode)
46)
47);
48}
49
50private static function convertChar(string $char): string
51{
52$codepoint = self::INDICATOR_OFFSET + ord($char);
53
54$byte0 = 0b10000000 + ($codepoint & 0b111111);
55$byte1 = 0b10000000 + (($codepoint >> 6) & 0b111111);
56$byte2 = 0b10000000 + (($codepoint >> 12) & 0b111111);
57$byte3 = 0b11110000 + (($codepoint >> 18) & 0b111);
58
59return chr($byte3) . chr($byte2) . chr($byte1) . chr($byte0);
60}
61}
62