Если TECGetTextEncodingFromInternetName () требует строку в стиле Pascal, почему CopyCStringToPascal () больше не поддерживается в OSX 10.5? - PullRequest
0 голосов
/ 16 июля 2011

Я отвечаю за сборку старой версии библиотеки с открытым исходным кодом для OSX 10.5.(Библиотека Xerces 2.8.)

Библиотека не может быть встроена в OSX 10.5 из-за (среди прочего) использования прекращенной функции OSX CopyCStringToPascal().Соответствующий фрагмент кода:

Str255 pasEncodingName;
...
CopyCStringToPascal(cEncodingName, pasEncodingName);
TECGetTextEncodingFromInternetName (&textEncoding, pasEncodingName);

Исследование показало, что CopyCStringToPascal() действительно преобразовывает строку C в строку в стиле Паскаля (строка, для которой первый байт предоставляет количество символов встрока).Поэтому из контекста ясно, что вторым параметром TECGetTextEncodingFromInternetName() должна быть строка в стиле Паскаля (хотя я не могу найти это подтвержденное ни в одной документации по очистке интернета).

Поскольку новейшая версиябиблиотека с открытым исходным кодом (Xerces 3.1) успешно строится на OSX 10.5, и ее реализация явно определяет функцию CopyCStringToPascal() (поскольку она была прекращена в OSX 10.5) для создания строки в стиле Pascal, и продолжает использовать TECGetTextEncodingFromInternetName() (который не был прекращен в OSX 10.5), я верю, что это является подтверждением того, что TECGetTextEncodingFromInternetName() продолжает требовать строку в стиле Pascal даже для OSX 10.5.

Поскольку строки в стиле Pascal требуются ВСЕ ЕЩЕиз-за текущих системных процедур OSX 10.5 я озадачен тем, почему функция CopyCStringToPascal(), преобразующая в такую ​​необходимую строку Паскаля, была прекращена в OSX 10.5.Я пишу этот вопрос, чтобы еще раз подтвердить, что я не делаю ошибку, просто явно определив эту функцию для Xerces 2.8 (и в противном случае ничего не меняя в области кода, относящейся к этому обсуждению), чтобы заставить Xerces 2.8сборка с OSX 10.5.Спасибо.

Ответы [ 2 ]

2 голосов
/ 16 июля 2011

Существует три пути обновления, все через CFString.

Первое, уже предложенное Grady Player, - это использование CFString для преобразования имени кодировки в строку Паскаля. Вы можете начать с имени кодировки в CFString (используя макрос CFSTR); если нет, вы можете создать CFString из строки C и строку Pascal из CFString.

Второй - использовать CFString вместо Text Encoding Conversion Manager для преобразования имени кодировки в идентификатор кодировки. CFString и TEC используют одинаковые идентификаторы (сравните константы между CFStringEncodingExt.h и TextCommon.h), поэтому вы можете использовать CFStringConvertIANACharSetNameToEncoding - который принимает имя кодировки как CFString - для получения идентификатора кодировки. Если вы передадите идентификатор кодировки из CF в TEC, это будет своего рода обманом, но пока Apple не считает нужным изменять все константы без видимой причины, это будет работать.

Третье - использовать CFString для самого преобразования. Создайте CFString из ввода, используя CFStringCreateWithBytes, и используйте CFStringGetBytes, чтобы определить длину вывода, а затем снова, чтобы выполнить преобразование. Этот раствор полностью исключает ТЕС.

Хотя сам TEC не устарел (пока), если для его работы требуется использование или переосмысление других API, которые устарели / удалены, это также является плохим признаком долговечности вашего кода на основе TEC. Я предлагаю сообщить об ошибке , чтобы попросить современную замену в TEC для TECGetTextEncodingFromInternetName; вы можете решить, что делать, основываясь на ответе, полученном на ваш запрос.

0 голосов
/ 16 июля 2011

Если вы просто ищете Ссылка CFString , вы увидите несколько вещей, которые соответствуют Паскалю, из того, что я могу найти ...

попробуй

ConstStringPtr CFStringGetPascalStringPtr (
   CFStringRef theString,
   CFStringEncoding encoding
);

если не получится, используйте:

Boolean CFStringGetPascalString (
   CFStringRef theString,
   StringPtr buffer,
   CFIndex bufferSize,
   CFStringEncoding encoding
);

Также я не вижу, где написано, что вы должны использовать паскаль.

encodingName
An Internet encoding name, in 7-bit US ASCII.
...