Что такое "широкая символьная строка" на языке C?
я наткнулся на это в книге:
wscanf(L"%lf", &variable);
где первый параметр типа wchar_t *
.
это отличается от scanf("%lf", &variable);
где первый параметр типа char *
.
так в чем разница, чем. Я никогда раньше не слышал "широкую строку символов". Я слышал что-то под названием Raw String Literals, которое печатает строку как есть (нет необходимости в таких вещах, как escape-последовательности), но это не было в C.
2 ответов
на точно природа широких символов (целенаправленно) определена левая реализация.
когда они впервые изобрели понятие wchar_t
, ISO 10646 и Unicode все еще конкурировали друг с другом (тогда как теперь они в основном сотрудничают). Вместо того чтобы пытаться постановить, что международный характер будет тем или иным (или, возможно, чем-то совершенно иным), они просто предоставили тип (и некоторые функции), которые реализация могла бы определить для поддержки международные наборы символов по своему выбору.
различные реализации есть использовал этот потенциал для вариации. Например, если вы используете компилятор Microsoft в Windows,wchar_t
будет 16-битным типом, содержащим UTF-16 Unicode (первоначально он содержал UCS-2 Unicode, но теперь официально устарел).
В Linux wchar_t
чаще будет 32-битным типом, содержащим кодировку UCS-4/UTF-32 Unicode. Порты gcc, по крайней мере, для некоторых других операционных систем то же самое, хотя я никогда не пытался подтвердить, что это всегда так.
нет, однако, никакой гарантии этого. По крайней мере, теоретически реализация на Linux может использовать 16 бит, или один на Windows может использовать 32 бита, или любой из них может решить использовать 64 бита (хотя я был бы немного удивлен, увидев это на самом деле).
в любом случае, общее представление о том, как обстоят дела предназначены для работы, это один wchar_t
достаточно для представления кодовой точки. Для ввода-вывода данные предназначены для преобразования из внешнего представления (что бы это ни было) в wchar_t
s ,что (как предполагается) делает их относительно легко манипулировать. Затем во время вывода они снова преобразуются в кодировку по вашему выбору (которая может полностью отличаться от кодировки, которую Вы читаете).
"широкая символьная строка" относится к кодировке символов в строке.
С Википедия:
широкий символ-это тип данных компьютерного символа, который обычно имеет размер больше, чем традиционный 8-битный символ. Увеличение размер типа данных позволяет использовать большие кодированные наборы символов.
UTF-16 один из наиболее обыкновенно используемого широкого характера кодирования.
далее wchar_t
определяется Microsoft как данные. Это может быть и, скорее всего, другое определение в других операционных системах или языках.
из статьи Википедии Из комментария ниже:
" ширина wchar_t зависит от компилятора и может быть как 8 биты. Следовательно, программы, которые должны быть переносимыми через любой C или Компилятор C++ не должен использовать wchar_t для хранение текста в Юникоде. Этот тип wchar_t предназначен для хранения широких символов, определенных компилятором, которые могут быть символами Unicode в некоторых компиляторах."