Я пытаюсь понять, как C обрабатывает коды символов в Unicode. Я установил в качестве локали значение LC_ALL "fr_CA.UTF8", а затем ввел символ с wscanf()
(как массив wchar_t
...). Затем я исследую каждый байт и нахожу что-то странное. Я ввел тройной ключ («?», скопированный с веб-страницы), то есть U + 1d11e. На самом деле это 3 байта, поэтому я ожидал получить 2 wchar_t
. Я получил: 0x1e, 0xd1, 0x00, 0x00, последние два из которых являются нулевым окончательным символом. Вот мой код:
#include <stdio.h>
#include <locale.h>
#include <wchar.h>
int main ( int argc, char* argv[] )
{
setlocale( LC_ALL, "fr_CA.utf8" );
wchar_t input[256];
wscanf( L"%ls", input);
wprintf( L"%ls\n", input );
wprintf( L"Length = %d\n", wcslen( input ) );
wprintf( L"%d\n", (int)(input[0]&0x00ff) );
wprintf( L"%d\n", (int)((input[0]&0xff00)>>8) );
wprintf( L"%d\n", (int)(input[1]&0x00ff) );
wprintf( L"%d\n", (int)((input[1]&0xff00)>>8) );
wprintf( L"%d\n", (int)(input[2]&0x00ff) );
wprintf( L"%d\n", (int)((input[2]&0xff00)>>8) );
return 0;
}
Я ожидал, что 0x1e, 0xd1, 0x01, 0x00, 0x00, 0x00 ...
Но у меня есть 0x1e, 0xd1, 0x00, 0x00. ..
Что меня удивляет, так это то, что wprintf( L"%ls\n", input );
на самом деле правильно печатает тройную клавишу ... Итак что позволяет различать символы U + 1D11E и U + D11E?
Кроме того, я запускаю свою программу в Konsole в Kubuntu 16.04 LTS, и я скомпилировал ее с gcc 6.5.0 ... если это имеет значение.