Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

75 changes: 75 additions & 0 deletions ru/tutorials/emoji-flags.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
Флаги-эмодзи дают много возможностей для визуального отображения данных о странах. Если разобраться, как они работают и как создавать их программно, можно сделать интерфейс более простым и привлекательным для пользователей.

# Флаги и их структура

Они как и все остальные эмодзи, формируются с использованием символов Unicode. Каждый флаг-эмодзи состоит из двух символов. Они находятся в диапазоне от A-Z и предназначены для обозначения двухбуквенных кодов стран. Например, флаг Германии 🇩🇪 состоит из комбинации `U+1F1E9(D)` и `U+1F1EA(E)`.

![Структура флагов](https://cdn.sparrowcode.io/tutorials/emoji-flags/struct-flags.png)

# Получаем флаги через код страны

Зная о кодах стран и их эмодзи напишем простую функцию, которая автоматизирует этот процесс. Она может динамически генерировать флаги на основе введенных кодов стран.

```swift
func emojiFlag(countryCode: String) -> String? {
guardcountryCode.count == 2 else {
returnnil
}
// https://en.wikipedia.org/wiki/Regional_indicator_symbol
let regionalIndicatorStartIndex: UInt32 = 0x1F1E6
let alphabetOffset = UnicodeScalar(unicodeScalarLiteral: "A").value

return String(countryCode
.uppercased()
.unicodeScalars
.compactMap { UnicodeScalar(
regionalIndicatorStartIndex + ($0.value - alphabetOffset)
.map { Character($0) }
)
}

emojiFlag(countryCode: "CA") // "🇨🇦"
```

Это ускорить процесс добавления флагов в свое приложение, значительно ускоряя и упрощая процесс.

# Флаги внутри страны

На момент написания этой статьи, возможно добавление флагов подразделений страны, например, флаги Англии, Шотландии и Уэльса, что открывает еще больше возможностей.

![Флаги внутри страны](https://cdn.sparrowcode.io/tutorials/emoji-flags/country-flags.png)

Они используют другую последовательность символов, которая начинается с черного флага `U+1F3F4(🏴)` и заканчивается специальным кодом символа отмены `U+E007F`.


Используем предыдущую функцию, чтобы добавить вариант флагов внутри страны:

```swift
func emojiFlag(subdivision: String) -> String? {
guard let blackFlag = Unicode.Scalar(0x1F3F4),
let cancelTag = Unicode.Scalar(0xE007F) else {
return nil
}
// https://en.wikipedia.org/wiki/Tags_(Unicode_block)
let tagLetterOffset: UInt32 = 0xE0061
let alphabetOffset = UnicodeScalar(unicodeScalarLiteral: "a").value
return String(Character(blackFlag)) + String(subdivision
.lowercased()
.unicodeScalars
.compactMap { Unicode.Scalar(
tagLetterOffset + ($0.value - alphabetOffset)
)}
.map { Character($0) }
) + String(Character(cancelTag))
}

emojiFlag(subdivision: "GBENG") // "🏴󠁧󠁢󠁥󠁮󠁧󠁿"
emojiFlag(subdivision: "GBSCT") // "🏴󠁧󠁢󠁳󠁣󠁴󠁿"
emojiFlag(subdivision: "GBWLS") // "🏴󠁧󠁢󠁷󠁬󠁳󠁿"
```

# Политика Unicode к новым флагам

Консорциум Unicode перестал принимать новые заявки на флаги. Это значит, что появление свежих эмодзи-флагов невозможно без официального признания страны от ISO. Если страна получает такой статус, её флаг-эмодзи появится в следующей версии Unicode автоматически.


12 changes: 12 additions & 0 deletions ru/tutorials/meta/tutorials.json
Original file line number Diff line number Diff line change
Expand Up @@ -295,5 +295,17 @@
"google_structured_images": [],
"updated_date": "29.07.2024",
"added_date": "29.07.2024"
},
"emoji-flags": {
"title": "Эмодзи флаги",
"description": "Расскажем как именно работают эмодзи флаги и какие учесть нюансы.",
"categories": ["development", "swiftui", "uikit"],
"author": "sparrowcode",
"editors": [],
"keywords": ["emoji", "flags", "unicode"],
"graph_image": "https://cdn.sparrowcode.io/tutorials/emoji-flags/main-img.png",
"google_structured_images": [],
"updated_date": "30.08.2024",
"added_date": "30.08.2024"
}
}