如果tecgettextencodingfromminternetname()需要一个pascal风格的字符串,为什么在
If TECGetTextEncodingFromInternetName() requires a Pascal-style string, why is CopyCStringToPascal() discontinued in OSX 10.5?
为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.
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 如何用符合C++核心准则的代码替换C风格的字符串解析
- 如何按照 Google C++风格指南连接字符串文字?
- 将STD :: U8String复制到一个UTF8字符的C风格字符串中
- NULLPTR用于终止C风格的字符串
- 在班级中使用动态分配的C风格字符串,并带有复制和分配操作员,给出了意外的结果
- 使用PINVOKE编组LPWSTR的C风格数组,以托管字符串[]
- 无法将C风格的字符串推送到std::vector中
- 比较两个C风格字符串的正确函数是什么
- Perl风格的引号用于C++中的长字符串
- 对于c风格字符串,boost::spirit::qi和qi::alnum会导致模板编译错误
- c++中的C风格字符串和操作符重载
- 复制/连接动态分配的C风格字符串
- 基本的c风格字符串内存分配
- 如何判断c++模板类型是否为C风格字符串
- 将字符串转换为c风格字符串并检测空终止字符
- 使用c风格字符串字面值与构造未命名std::string对象的默认建议
- 从函数返回一个动态的C风格字符串
- 使用使用C风格字符串作为OUT参数的WinAPI函数
- 将c风格字符串传递给c++函数