Я много читал о 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? (источник)
Это все на данный момент. Заранее спасибо.
Я создаю приложение, которое может читать файл с этими точками кода, используя 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.