繁体   English   中英

如果 TECGetTextEncodingFromInternetName() 需要 Pascal 样式的字符串,为什么在 OSX 10.5 中不再使用 CopyCStringToPascal()?

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

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

由于(除其他外)使用了已停产的 OSX function CopyCStringToPascal() ,该库无法在 OSX 10.5 上开箱即用地构建。 相关的代码片段是:

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

调查表明CopyCStringToPascal()确实将 C 字符串转换为 Pascal 样式的字符串(第一个字节提供字符串中字符数的字符串)。 因此,从上下文来看,很明显TECGetTextEncodingFromInternetName()的第二个参数必须是 Pascal 样式的字符串(尽管我在任何来自互联网的文档中都找不到这一点)。

因为最新版本的开源库 (Xerces 3.1) 在 OSX 10.5 上成功构建,并且它的实现都明确定义了 function CopyCStringToPascal() (因为它已在 OSX 10.5 中停止使用)来创建 Pascal 样式的字符串,并且继续使用TECGetTextEncodingFromInternetName() (在 OSX 10.5 中尚未停止使用),我相信这是确认TECGetTextEncodingFromInternetName()即使对于 OSX 10.5 确实仍然需要 Pascal 样式的字符串。

因为当前 OSX 10.5 系统例程仍然需要 Pascal 样式的字符串,所以我很困惑为什么在 OSX 10.5 中停止了转换为如此必要的 Pascal 字符串的 function CopyCStringToPascal() 我写这个问题是为了进一步确认我没有犯错误,只需为 Xerces 2.8 明确定义这个 function (否则在与此讨论相关的代码区域中没有任何改变),以便让 Xerces 2.8使用 OSX 10.5 构建。 谢谢。

共有三种升级路径,均通过 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,这有点作弊,但只要 Apple 认为不适合无缘无故地更改所有常量,它就会起作用。

第三个是使用 CFString 进行转换本身。 使用 CFStringCreateWithBytes 从输入创建一个CFStringCreateWithBytes ,并使用CFStringGetBytes确定 output 长度,然后再次执行转换。 该解决方案完全放弃了 TEC。

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

如果你只是搜索CFString 参考你会看到一些匹配 Pascal 的东西,从我可以收集到的......

尝试

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.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM