如果tecgettextencodingfromminternetname()需要一个pascal风格的字符串,为什么在

If TECGetTextEncodingFromInternetName() requires a Pascal-style string, why is CopyCStringToPascal() discontinued in OSX 10.5?

本文关键字:风格 字符串 为什么 pascal tecgettextencodingfromminternetname 如果 一个      更新时间:2023-10-16

为OSX 10.5构建一个旧版本的开源库是我的责任。(库是Xerces 2.8)

由于(除其他事项外)使用已停止的OSX函数CopyCStringToPascal(),该库无法在OSX 10.5上立即构建。相关代码片段为:

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

研究表明,CopyCStringToPascal()确实将C字符串转换为pascal风格的字符串(其中第一个字节提供字符串中的字符数)。因此,从上下文中,很明显,TECGetTextEncodingFromInternetName()的第二个参数必须是一个帕斯卡风格的字符串(尽管我无法在清除互联网的任何文档中找到这一点)。

因为最新版本的开源库(Xerces 3.1)成功地构建在OSX 10.5上,它的实现既显式地定义了函数CopyCStringToPascal()(因为它已经在OSX 10.5中停止)来创建一个pascal风格的字符串,又继续使用TECGetTextEncodingFromInternetName()(在OSX 10.5中没有停止),我相信这是确认确实TECGetTextEncodingFromInternetName()继续需要一个pascal风格的字符串,甚至在OSX 10.5中。

因为当前OSX 10.5系统例程仍然需要Pascal风格的字符串,所以我很困惑为什么转换为如此必要的Pascal字符串的函数CopyCStringToPascal()在OSX 10.5中已经停止了。我写这个问题是为了进一步确认,为了让Xerces 2.8与OSX 10.5一起构建,我只是简单地为Xerces 2.8显式定义了这个函数(否则在与本讨论相关的代码领域没有改变任何东西),从而没有犯错误。谢谢。

有三个升级路径,都通过CFString。

第一个,Grady Player已经建议的,是使用CFString将编码名称转换为Pascal字符串。你可以从CFString中的编码名称开始(使用CFSTR宏);如果没有,你可以从C字符串中创建一个CFString,从CFString中创建一个Pascal字符串。

第二个是使用CFString,而不是Text Encoding Conversion Manager,将编码名称转换为编码标识符。CFString和TEC都使用相同的标识符(比较CFStringEncodingExt.h和TextCommon.h之间的常量),因此您可以使用CFStringConvertIANACharSetNameToEncoding—它将编码名称作为CFString—来获得编码标识符。如果你把编码标识符从CF传递到TEC,这是一种欺骗,但只要苹果公司认为不适合无故改变所有常量,它就可以工作。

第三种方法是对转换本身使用CFString。使用CFStringCreateWithBytes从输入创建CFString,并使用CFStringGetBytes确定输出长度,然后再次执行转换。这个解决方案完全降低了TEC。

虽然TEC本身还没有被弃用,但如果它需要使用或重新发明其他已被弃用/删除的api才能使其工作,这对于基于TEC的代码的寿命来说也是一个不好的迹象。我建议提交一个bug,要求在TECGetTextEncodingFromInternetName的TEC中进行现代替换;您可以根据对请求的响应来决定要做什么。

如果你只是搜索CFString引用,你会看到一些与Pascal匹配的东西,从我可以收集到的…

ConstStringPtr CFStringGetPascalStringPtr (
   CFStringRef theString,
   CFStringEncoding encoding
);

如果失败,使用:

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

我也没有看到它说你应该使用pascal字符串

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