楼主认为AnsiPos、ByteType 等函数在不同语系的Windows 中处理相同的数据时可能会出问题,但你举的几个例子并不能支持这种说法。因为,AnsiPos('简体','简体中文')和ByteType('简体中文ddsa',7)这两条语句不管是在简体还是繁体中文的Windows 里面执行的结果都是一样的。
就我个人对ANSI字符集和代码页等问题的认识而言,这是再自然不过的事情。实际上,对任何一个ANSI(也即非Unicode)的应用程序来说,根本不存在所谓的“非当前代码页字符串”,在程序里面的任何一个字符串都会被当作系统当前默认语系的字符串来处理。就拿楼主所举的字符串例子来说吧,当我们在源程序中写下“AnsiPos('简体','简体中文')”这条语句时(假设我们是在简体中文环境下开发程序),由于AnsiPos函数是处理ANSI字符串的,而ANSI字符串又是基于系统当前默认语系的字符集的,所以这条语句在编译时编会被编译为类似于“AnsiPos(#$BC#$F2#$CC#$E5,#$BC#$F2#$CC#$E5#$D6#$D0#$CE#$C4)”这样的代码(其中的十六机制数就是“简体”和“简体中文”几个汉字在GBK字符集中的编码值)。当程序运行在简体中文的系统上的时候,这些编码值所代表的就是“简体”和“简体中文”这两个字符串。但把这个程序放到繁体中文的系统上运行的时候,它会用繁体中文语系的Big5字符集来解释这些编码值(注意,此时从已编译的程序的角度而言,它所处理的字符串--实际上是一连串的编码值组成的序列--并没有变,变的是不同语系的字符集对这些编码的定义),我们可以做一个小小的试验:用记事本写一个包含“简体中文”这几个字的文本文件,然后用IE来打开它。如果IE的编码为“简体中文”的话,那么毫无疑问文档内容会显示出“简体中文”这几个字;但如果我们将IE的编码改为“繁体中文”,你就会看到文档已经被显示成了“潠极笢恅”这几个字(注意了,这几个可不是什么乱码,而是在GBK和Big5字符集中都确确实实存在的合法的汉字字符)。这个试验表明:“简体中文”这几个字在GBK中的编码如果放到Big5里面去的话,表示的是“潠极笢恅”这四个字。所以我们在简体中文系统下开发的程序在简体中文系统下执行“AnsiPos(#$BC#$F2#$CC#$E5,#$BC#$F2#$CC#$E5#$D6#$D0#$CE#$C4)”这条语句时,可以认为它执行的就是我们在源程序里所写的“AnsiPos('简体','简体中文')”这条语句;但如果是在繁体中文系统下执行的话,这条语句就会被解释成“AnsiPos('潠极','潠极笢恅')”了。虽然两者从自然语言文字的角度来说完全不同,但从计算机程序的角度而言,它们都是由一连串相同的编码组成的序列。所以不论是在简体还是繁体中文系统中,这条语句的执行结果都是一样的。因此,对于ANSI程序来说,并不存在什么“非当前代码页的字符串”,所有的字符串都会被(事实上也只能)当作系统当前默认代码页的字符串来处理--举个可能不是很恰当的例子吧--这就跟电影里面黄飞鸿把“I Love You”说成(并且也理解成)“爱老虎油”是一样的道理。
至于英文版的操作系统有点特殊,因为Delphi 里面所有带Ansi-前缀的函数几乎都会直接或者间接地调用到ByteType函数,而这个函数首先会判断系统当前默认的语系是否远东语系,如果不是,它就会直接判断为单字节字符。所以如果要在非远东语系的Windows 系统中处理包含远东字符的字符串的话,最好还是不要用带Ansi-前缀的函数,而是用普通的字符串处理函数,将所有的字符串(不管它包含什么字符)都当作是由一个个字节而不是字符组成的序列来处理。比如,将AnsiPos('卫','何丽')改成Pos('卫','何丽'),这样就不会有问题了。