[英]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.