Intereting Posts
Приглашение Spinner не показывает Проблемы с воспроизведением Android Studio 1.5.1 Импорт моей библиотеки Android в приложение не распознается как библиотека Отправка данных через разъем для наушников на телефонах Android Helpl.exe Ошибка при создании каталогов: Недопустимый аргумент Предупреждение о безопасности в libpng в моей консоли Google Play Подключение к интернету приостановлено после блокировки телефона Android «IOException: повторите попытку» при использовании LocalServerSocket Начать сервис по установке приложения без каких-либо действий Ошибка: я могу щелкнуть в навигационном ящике Как отключить / изменить AutoFocus и AutoWhiteBalance на Android-камеру с помощью OpenCV JQuery mobile отключить содержимое страницы вертикальной прокрутки Android Studio 1.2 – несоответствие проектной кодировки по умолчанию Запись аудио в приложении Android как услуге Scrollview может содержать только одного прямого дочернего

Sprintf () обработка% s расширенного ASCII (ISO 8859-1) в некоторых режимах работы?

Я использую ISO 8859-1 (латинский расширенный набор символов ASCII) в моем приложении C. Когда я strcpy / strcat части строки вместе, он отлично работает. Но когда я использую sprintf("%s %s") , в некоторых версиях (в частности, определенных версиях Android) строка будет усекаться, когда удаляется расширенный символ ASCII (в частности, é , хотя я еще не пробовал других).

Я думал, что %s должен был просто скопировать байты до тех пор, пока не ударит '\0' . Я подозреваю, что strcpy / strcat работает, потому что он делает именно это, без какого-либо форматирования. Что может быть здесь?

Я должен отметить, что я не просматриваю текст с помощью printf() , скорее мой собственный механизм визуализации текста, который отлично справляется с ISO-8859-1.

ОБНОВЛЕНИЕ. Чтобы уточнить, у меня есть приложение NDK, которое хранит строку в C и передает ее моему движку текстового рендеринга на основе OpenGL. Если я передаю полную строку в виде символа char *, он отобразится в порядке. Если я sprintf () части вместе, он усекается на символ é. Например:

 char buffer[1024]; strcpy(buffer, "This is "); strcat(buffer, "the string I want to diésplay."); 

Это хорошо. Но это:

 sprintf(buffer, "%s%s", "This is ", "the string I want to diésplay."); 

Печатает как:

 This is the string I want to di 

Поведение s[n]printf() задается иначе, чем поведение функций манипуляции строкой, таких как strcpy() и strcat() . Функции printf -family необходимы для создания одинаковых последовательностей байтов при представлении идентичных форматов и печатных элементов. Единственная разница в том, куда отправляются эти байты. Таким образом, если ваша библиотека C была построена таким образом, что при печати в стандартные потоки через printf() она выполняла преобразование в строковых данных (возможно, перекодирование printf() , тогда она выполняла бы такое же преобразование при печати в строку через sprintf() .

«F» в «printf» предназначен для «форматирования». В стандарте не сказано и не подразумевается, что форматирование строки должно означать сброс своих байтов в вывод дословно, поэтому перекодирование или другое преобразование, такое как я выдвинутое выше, не может быть и речи. Фактически, документы для некоторых версий этих функций указывают на локальную зависимость («Обратите внимание, что длина произведенных строк зависит от языка и трудно предсказать»), поэтому перекодирование, в частности, является реальной возможностью.

Любое конкретное объяснение сторонних наблюдений, которое вы описываете, обязательно будет спекулятивным, поскольку вы не представили достаточно кода или данных, чтобы сделать уверенный диагноз. Я склонен подозревать, что проблема связана с запуском программы в локали, которая использует кодировку символов, отличную от той, которая используется внутри программы. Если это так, то вы можете воспроизвести проблему локально, изменив локаль, в которой вы запустили, и вы можете обратиться к ней, гарантируя тем или иным способом, что ваша программа всегда работает в подходящей языковой версии. Помимо прочего, вы можете использовать функции getlocale() и setlocale() чтобы помочь здесь, особенно если вы хотите ограничить область, в которой вы выполняете управление локалью.

Однако, в конечном счете, вы полагаетесь на функции printf-family только для манипуляций с строками, однако я думаю, что было бы лучше использовать обходное решение, представленное в вопросе: насколько это возможно, использовать специальные функции управления строкой C, такие как strcpy() И strncat() , чтобы выполнить построение строки. Поскольку вы не полагаетесь на функции stdio для вашего фактического вывода, это должно быть хорошо.