Въпроси за Unicode, UTF-8, UTF-16 и UTF-32 [затворени]

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

1 - Unicode е стандарт за кодиране на знаци и те определят кодова точка за всеки знак. Нещо като U+0000 (пример). Представете си, че имам файл, който има тези кодови точки (), в коя точка от приложението си ще го използвам?

Това може да е глупав въпрос, но наистина не знам в коя точка от приложението си ще го използвам. Създавам приложение, което може да чете файл, който има тези кодови точки, използвайки 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 – Представете си сега, че прочетох файла, кодирах го, имам всички кодови точки и трябва да запазя файла отново. Трябва ли да го запазя кодиран () или трябва първо да декодирам, за да го трансформирам отново в знаци и след това да запазя?

7 - Защо думата "unicode" е малко претоварена и понякога се разбира като utf-16? (източник)

Това е всичко за сега. Благодаря предварително.


person SH.0x90    schedule 30.06.2014    source източник
comment
символи е двусмислен: често се използва за кодова единица, но правилно се отнася до кодова точка или дори графема. Използвайте по-малко двусмислен термин тук.   -  person Deduplicator    schedule 30.06.2014
comment
Изглежда, че искате пълен буквар за Unicode. Прочетохте ли страниците на wikipedia?   -  person Deduplicator    schedule 30.06.2014
comment
Да, имах и имам тези въпроси.   -  person SH.0x90    schedule 30.06.2014
comment
Свързано четене (трябва да се отговори и на точка 7, ако не на всички): utf8everywhere.org   -  person Deduplicator    schedule 30.06.2014
comment
Благодаря @Deduplicator, ще го прочета.   -  person SH.0x90    schedule 30.06.2014
comment
Трябва да задавате един въпрос наведнъж и трябва да помислите дали това наистина е програмен въпрос, който е по темата в SO. Освен това въпросите трябва да са добре формулирани, на които има отговор. Например, не мога да видя какво питате във вашия въпрос 1; вие не казвате нищо за вашето приложение, но вие молите другите да кажат какво да правят с някои знаци в него.   -  person Jukka K. Korpela    schedule 30.06.2014


Отговори (1)


Създавам приложение, което може да чете файл, който има тези кодови точки, използвайки escape \u и знам, че мога да го прочета, да го декодирам, но сега следващият въпрос.

Ако пишете програма, която обработва някакъв вид персонализирани екрани, като \uXXXX, зависи изцяло от вас кога да конвертирате тези екрани в Unicode кодови точки.

В кой набор от знаци (кодова страница) трябва да го конвертирам?

Това зависи от това какво искате да правите. Ако използвате друга библиотека, която изисква конкретна кодова страница, тогава зависи от вас да конвертирате данни от едно кодиране в кодирането, изисквано от тази библиотека. Ако нямате строги изисквания, наложени от такива библиотеки на трети страни, тогава може да няма причина да правите преобразуване.

Чудех се, в C++, ако се опитам да покажа не-ASCII знаци на терминала, получавам някои объркващи думи.

Това е така, защото различните слоеве на технологичния стек използват различни кодировки. От примерния изход, който давате, "├Â" мога да видя, че това, което се случва, е, че вашият компилатор кодира литерала на низа като UTF-8, но конзолата използва кодова страница 850 на Windows. Обикновено, когато има проблеми с кодирането на конзолата, можете да ги коригирате като настроите кодовата страница на изхода на конзолата на правилната стойност, за съжаление предаването на 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". Сега използвайте шестнадесетичен редактор и разгледайте съдържанието на двата файла.

Представете си сега, че прочетох файла, кодирах го, имам всички кодови точки и трябва да запазя файла отново. Трябва ли да го запазя кодиран () или трябва първо да декодирам, за да го трансформирам отново в знаци и след това да запазя?

Това зависи от програмата, която ще трябва да прочете файла. Ако програмата очаква всички не-ASCII символи да бъдат екранирани по този начин, тогава трябва да запишете файла по този начин. Но екранирането на знаци с \u не е нормално нещо. Виждам това да се прави само на няколко места, като JSON данни и изходен код на C++.

Защо думата "unicode" е малко претоварена и понякога се разбира като utf-16?

До голяма степен защото Microsoft използва термина по този начин. Те го правят по исторически причини: когато добавиха поддръжка на Unicode, те нарекоха всички свои опции и настройки „Unicode“, но единственото кодиране, което поддържаха, беше UTF-16.

person bames53    schedule 30.06.2014