Unicode, UTF-8, UTF-16 и UTF-32 вопросы

Я много читал о Unicode, ASCII, кодовых страницах, всей истории, изобретении UTF-8, UTF-16 (UCS-2), UTF-32 (UCS-4) и кто их использует и так далее, но я У меня все еще есть вопросы, на которые я пытался найти ответы, но не смог, и я надеюсь, что вы мне поможете.

1 — Юникод является стандартом для кодирования символов, и они указывают кодовую точку для каждого символа. Что-то вроде U + 0000 (пример). Представьте, что у меня есть файл с этими кодами (\ u0000), в какой точке моего приложения я собираюсь его использовать?

Это может быть глупый вопрос, но я действительно не знаю, в какой точке моего приложения я собираюсь его использовать.
Я создаю приложение, которое может читать файл с этими кодами, используя escape \u и я знаю, что могу это прочитать, расшифровать, но теперь следующий вопрос.

2 — В какой набор символов (кодовую страницу) мне нужно его преобразовать? Я видел некоторые библиотеки C ++, которые используют имя utf8_to_unicode или же utf8-to-utf16 а также только utf8_decodeи вот что меня смущает.

Я не знаю, появятся ли такие ответы, но некоторые могут сказать: вам нужно преобразовать их в кодовые страницы, которые вы собираетесь использовать, но что, если мое приложение должно быть интернационализировано?

3 — мне было интересно, что в C ++, если я пытаюсь отображать символы не-ASCII на терминале, я получаю некоторые запутанные слова. Вопрос заключается в следующем: что делает отображаемые символы шрифтами?

#include <iostream>

int main()
{
std::cout << "ö" << std::endl;

return 0;
}

Выход (Windows):

├Â

4 — В какую часть этого процесса входит кодировка? Он кодирует, берет кодовую точку и пытается найти слово, равное шрифту?

5 = WebKit — это движок для рендеринга веб-страниц в веб-браузерах, если вы указываете кодировку как UTF-8, она прекрасно работает со всеми символами, но если я укажу другую кодировку, это не так, не имеет значения, какой шрифт я использую, что случилось?

<html>
<head>
<meta charset="iso-8859-1">
</head>
<body>
<p>ö</p>
</body>
</html>

Выход:

ö

Работает с использованием:

<meta charset="utf-8">

6 — Теперь представьте, что я прочитал файл, зашифровал его, у меня есть все точки кода, и мне нужно снова сохранить файл. Нужно ли сохранять его в кодированном виде (\ u0000) или мне нужно сначала декодировать, чтобы снова преобразовать в символы, а затем сохранить?

7 — Почему слово «юникод» немного перегружено и иногда понимается как utf-16? (источник)

Это все на данный момент. Заранее спасибо.

-1

Решение

Я создаю приложение, которое может читать файл с этими точками кода, используя escape \ u, и я знаю, что могу его прочитать, декодировать, но теперь следующий вопрос.

Если вы пишете программу, которая обрабатывает какие-то пользовательские экранирования, такие как \uXXXXвсе зависит от вас, когда преобразовать эти экранированные символы в кодовые точки Unicode.

В какой набор символов (кодовую страницу) мне нужно его преобразовать?

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

Мне было интересно, что в C ++, если я пытаюсь отображать символы не-ASCII на терминале, я получаю некоторые запутанные слова.

Это связано с тем, что разные уровни технологического стека используют разные кодировки. Из примера вывода, который вы даете, "├Â" Я вижу, что происходит то, что ваш компилятор кодирует строковый литерал как UTF-8, но консоль использует кодовую страницу Windows 850. Обычно, когда возникают проблемы с кодированием консоли, вы можете их исправить, установив кодовую страницу вывода консоли на правильное значение, к сожалению, передавая UTF-8 через std::cout В настоящее время есть некоторые уникальные проблемы. С помощью printf вместо этого работал для меня в VS2012:

#include <cstdio>
#include <Windows.h>

int main() {
SetConsoleOutputCP(CP_UTF8);
std::printf("%s\n", "ö");
}

Надеемся, что Microsoft исправит библиотеки C ++, если они этого еще не сделали в VS 14.

В какую часть этого процесса входит кодировка? Он кодирует, берет кодовую точку и пытается найти слово, равное шрифту?

Байты данных не имеют смысла, если вы не знаете кодировку. Таким образом, кодирование имеет значение во всех частях процесса.

Я не понимаю второй вопрос здесь.

если вы указываете кодировку как UTF-8, она прекрасно работает со всеми символами, но если я укажу другую кодировку, это не так, не имеет значения, какой шрифт я использую, что произойдет?

Здесь происходит то, что когда вы пишете charset="iso-8859-1" Вы также должны конвертировать документ в эту кодировку. Вы этого не делаете, и вместо этого вы оставляете документ в кодировке UTF-8.

В качестве небольшого упражнения, скажем, у меня есть файл, который содержит следующие два байта:

0xC3 0xB6

Используя информацию о кодировании и декодировании UTF-8, в какую кодовую точку декодируются байты?

Сейчас использую эта 8859-1 кодовая страница, во что декодируют одни и те же байты?

В качестве другого упражнения сохраните две копии вашего HTML-документа, используя одну charset="iso-8859-1" и один с charset="utf-8", Теперь используйте шестнадцатеричный редактор и изучите содержимое обоих файлов.

Теперь представьте, что я прочитал файл, зашифровал его, у меня есть все точки кода, и мне нужно снова сохранить файл. Нужно ли сохранять его в кодированном виде (\ u0000) или мне нужно сначала декодировать, чтобы снова преобразовать в символы, а затем сохранить?

Это зависит от программы, которая должна будет прочитать файл. Если программа ожидает, что все символы, не входящие в ASCII, будут экранированы таким образом, вы должны сохранить файл таким образом. Но избегая персонажей с \u это не нормальная вещь, чтобы сделать. Я вижу это только в нескольких местах, таких как данные JSON и исходный код C ++.

Почему слово «юникод» немного перегружено и иногда понимается как utf-16?

Во многом потому, что Microsoft использует этот термин таким образом. Они делают это по историческим причинам: когда они добавили поддержку Unicode, они назвали все свои параметры и установили «Unicode», но единственной поддерживаемой кодировкой была UTF-16.

1

Другие решения


По вопросам рекламы [email protected]