一般指导原则的问题在于,类似这样的事情可能对某人的情况非常具体。你的例子就是其中之一。
不过,对于谷歌搜索的人,在这里到达,一些一般性的指导方针是:
是,转换为Unicode。不要试图让旧应用完全使用AnsiString
s。原因是整个VCL是Unicode的,你不应该试图混合这两个,因为每次你将一个Unicode字符串分配给一个ANSI字符串时,你就会进行转换,这是一个有损转换。试图保持旧的方式,因为它的工作较少(或类似的原因)会导致你痛苦;只需拥抱新的string
类型,转换并使用它。
而不是随机混合这两个,明确地执行任何你需要的转换 - 例如,如果你从程序的旧版本加载数据,你知道它将是ANSI,所以阅读它成为一个Unicode字符串在那里,就是这样。之后,它将是Unicode。
你不应该改变你的string
变量的类型 - string
pre-D2009是ANSI,而在D2009和alter是Unicode。相反,请按照compiler warnings并观察您使用哪种字符串方法 - 有些仍然采用AnsiString
参数,我觉得这一切都令人困惑。编译器会告诉你。
如果使用字符串来保存字节(换句话说,将它们用作字节数组,因为字符是字节)切换到TBytes
。您可能会遇到特定的问题,如加密(字符串不再是字节/字符,所以'字符'为'字符',你可能会得到不同的输出)。读取文本文件(使用流类和TEncoding);坦率地说,还有其他的东西。在这里搜索,大多数事情都被问过。
提意见,请添加更多的建议...我一直都用C++ Builder中,不德尔福,并且有可能相当德尔福一些具体的事情我不知道。
现在为您的具体问题:你应该转换这个库吗?
如果:
- A之间的值和U是真正的永远只能在这个范围内,并
- 这些值表示的字符(A真的是A,而不是字节值65 - 如果是这样,使用TB的),和
- 您加载大的文本文件和内存是个问题
则没有转换为Unicode的,并没有切换你的string
s到AnsiString
s,是有道理的。
注意:
- 还有每次你从ANSI转换为Unicode时间
- 你可以使用
UTF8String
,这是转换时不会有损AnsiString
特定类型是开销,仍然将大部分文本(罗马字符)存储在单个字节中
- 将
string
的所有实例更改为AnsiString
可能有点工作,您需要检查与它们一起调用的所有方法,以查看是否有太多隐式转换正在执行med(用于性能)等
- 您可能需要更改库的外层以使用Unicode,以便转换代码或ANSI/Unicode编译器警告对您的库的用户不可见
- 如果您转换为Unicode ,字符集(不记得语法,也许
if 'S' in MySet
?)won't work。从字符A到U的描述中,我可以猜测你想使用这种语法。
我的推荐?就我个人而言,根据您提供的信息来做这件事的唯一原因是内存使用情况,以及可能的性能,这取决于您使用这么大数量的A..U
s所做的事情。如果这真的很重要,它既是驱动程序又是约束条件,你应该转换为ANSI。
谢谢大卫。我开始把这个库转换成Ansi,这很合理。我还看到,这个库和其他经典(unicode)库之间的交互作用并不像我担心的那么大。大多数情况下,我必须在画布上“打印”这些A-U字符串。太糟糕了,我以前没有用UTF8String的想法。我已经开始了我的转换。但如果我看到问题,我会明确地想到它。再次感谢。 – Ampere 2011-05-19 09:44:35