Предположим, что имеется только C99 Standard бумага и printf
Функция библиотеки должна быть реализована в соответствии с этим стандартом для работы с кодировкой UTF-16, не могли бы вы прояснить ожидаемое поведение для преобразования s
с точностью указано?C99 Стандарт - fprintf - s преобразование с точностью
С99 Стандартный (7.19.6.1) для преобразования s
говорит:
Если ни один модификатор л Длина не присутствует, аргумент должен быть указателем на начальный элемент массива символьного типа. Символы из массива записываются в (но не включая) завершающий нулевой символ. Если задана точность, то не больше, чем написано много байтов. Если точность не указана или больше размера массива, массив должен содержать нулевой символ.
Если присутствует модификатор длины l, аргумент должен быть указателем на исходный элемент массива типа wchar_t. Широкие символы из массива преобразуются в многобайтовые символы (каждый, как если бы вызывал функцию wcrtomb, с состоянием преобразования, описанным объектом mbstate_t, инициализированным до нуля до первого первого символа), вплоть до нулевой ширины персонаж. Полученные многобайтовые символы записываются в (но не включая) завершающий нулевой символ (байт). Если точность не указана, массив должен содержать нулевой широкий символ. Если задана точность, то не больше, чем записано много байтов (включая последовательности сдвигов, если они есть), и массив должен содержать нулевой широкий символ, если для того, чтобы равняться длине последовательности многобайтовых символов, заданной точностью, функция должна была бы для доступа к широкому символу за концом массива. Ни в коем случае не является частичным многобайтовым символом.
Я не совсем понимаю этот параграф в целом и утверждение «Если указана точность, в частности, не больше, чем указано много байтов».
Например, возьмем строку UTF-16 «TEST» (последовательность байтов: 0x54, 0x00, 0x45, 0x00, 0x53, 0x00, 0x54, 0x00).
Что, как ожидается, будут записаны в выходной буфер в следующих случаях:
- Если точность составляет 3
- Если точность 9 (один байт больше, чем длина строки)
- Если точность составляет 12 (несколько байт больше длины шнура)
Тогда есть также «Широкие символы из массива преобразуются в многобайтовые символы». Означает ли это, что UTF-16 следует сначала преобразовать в UTF-8? Это довольно странно, если я буду работать только с UTF-16.
'% s' принимает строку. Вы не можете хранить UTF-16 в строке C из-за всех нулевых байтов. (Кроме того, UTF-16 не является набором символов, это кодировка.) – melpomene
'' \ x54 \ x00 \ x45 \ x00 \ x53 \ x00 \ x54 \ x00 "' представляет собой строку длиной 1, содержащую 'T'. – melpomene
Вы конкретно спрашиваете о '% ls' /' wchar_t'? – melpomene