Подтвердить что ты не робот

Что такое "широкая строка символов" на языке C?

Я нашел это в книге:

wscanf(L"%lf", &variable);

где первый параметр имеет тип wchar_t *.

Это отличается от scanf("%lf", &variable);, где первый параметр имеет тип char *.

Так в чем разница. Раньше я никогда не слышал "широкую строку символов". Я слышал что-то, называемое Raw String Literals, которое печатает строку как есть (нет необходимости в таких вещах, как escape-последовательности), но это не было в C.

4b9b3361

Ответ 1

Точная природа широких символов (целенаправленно) определяется левой реализацией.

Когда они впервые изобрели концепцию wchar_t, ISO 10646 и Unicode все еще конкурировали друг с другом (тогда как сейчас они в основном сотрудничают). Вместо того, чтобы пытаться указывать, что международный символ будет тем или иным (или, возможно, совсем другим), он просто предоставил тип (и некоторые функции), который реализация могла бы определить для поддержки международных наборов символов по своему усмотрению.

Различные реализации использовали этот потенциал для изменения. Например, если вы используете компилятор Microsoft в Windows, wchar_t будет иметь 16-разрядный тип, содержащий UIF-16 Unicode (первоначально он состоял из Unicode UCS-2, но теперь он официально устарел).

В Linux wchar_t чаще будет 32-разрядным типом, поддерживающим кодировку Unicode, кодированной UCS-4/UTF-32. Порты gcc по крайней мере в некоторых других операционных системах делают то же самое, хотя я никогда не пытался подтвердить, что это всегда так.

Однако это не гарантирует. По крайней мере теоретически реализация на Linux могла бы использовать 16 бит, или одна на Windows могла бы использовать 32 бита, или любой из них мог бы решить использовать 64 бита (хотя я был бы немного удивлен, увидев это на самом деле).

В любом случае общая идея о том, как все должно работать, состоит в том, что для представления кодовой точки достаточно одного wchar_t. Для ввода-вывода данные предназначены для преобразования из внешнего представления (независимо от того, что оно есть) в wchar_t s, что (должно быть) делает их относительно легко манипулировать. Затем во время вывода они снова преобразуются в кодировку по вашему выбору (которая может сильно отличаться от прочитанной вами кодировки).

Ответ 2

"Широкая строка символов" относится к кодировке символов в строке.

От Wikipedia:

Широкий символ - это тип данных компьютерного символа, который обычно имеет размер больше, чем традиционный 8-разрядный символ. Увеличение datatype size позволяет использовать более крупные кодированные наборы символов.

UTF-16 является одним из наиболее часто используемых кодировок широкого символа.

Кроме того, wchar_t определяется Microsoft как объект данных unsigned short(16-bit). Это может быть и, скорее всего, другое определение в других операционных системах или языках.

Взято из статьи в Википедии из комментария ниже:

"Ширина wchar_t специфична для компилятора и может быть как 8 биты. Следовательно, программы, которые должны быть переносимыми через любой C или Компилятор С++ не должен использовать wchar_t для хранения текста в Юникоде. Тип wchar_t предназначен для хранения широких символов, определяемых компилятором, которые могут быть символами Unicode в некоторых компиляторах."