我想将所有其他库转换为Unicode,但是对于这个特定的库,我认为更好地遵守ANSI.优点是内存需求,因为在某些情况下,我加载非常大的TXT文件(仅包含Ansi字符).缺点可能是当我使这些库与普通(unicode)库进行交互时,我必须做很多很多的类型转换.
有一些一般的指导方针,显示何时可以转换为Unicode,何时坚持使用Ansi?
解决方法
然而,对于Googling的人来到这里,一些一般的指导方针是:
>是的,转换为Unicode.不要尝试使用AnsiStrings完全保留旧的应用程序.原因是整个VCL是Unicode,你不应该尝试混合这两个,因为你将转换每次你分配一个Unicode字符串到一个ANSI字符串,这是一个有损的转换.试图保持旧的方式,因为它的工作较少(或类似的原因)会导致你的痛苦;只是拥抱新的字符串类型,转换,并与它一起去.
>而不是随机混合这两个,明确地执行你需要的任何转换,一次 – 例如,如果你从旧版本的程序加载数据,你知道它将是ANSI,所以读它到一个Unicode字符串,就是这样以后,它将是Unicode.
>您不需要更改字符串变量的类型 – 字符串pre-D2009是ANSI,D2009和alter是Unicode.相反,请遵循compiler warnings并查看您使用的字符串方法 - 有些仍然采用AnsiString参数,我发现这些都令人困惑.编译器会告诉你的.
>如果使用字符串来保存字节(换句话说,由于字符是一个字节,将它们用作字节数组)切换到TBytes
.
>您可能会遇到加密的特定问题(字符串不再是字节/字符,所以’角色’的’字符’可能会得到不同的输出);阅读文本文件(使用流类和TEncoding);坦率地说,杂项的东西.在这里搜索SO,大多数事情都被问过.
评论者,请添加更多的建议…我主要使用C Builder,而不是Delphi,并且可能有很多具体的东西对于Delphi我不知道.
现在你的具体问题:你应该转换这个图书馆吗?
如果:
> A和U之间的价值真的只有这个范围,而且
>这些值表示字符(A真的是A,不是字节值65 – 如果是,使用TBytes)和
>你加载大文本文件和内存是一个问题
然后不转换为Unicode,而是将字符串切换到AnsiStrings,这是有道理的.
请注意:
>每次从ANSI转换为Unicode时都有一个开销
>您可以使用UTF8String
,它是一种特定类型的AnsiString,在转换时不会有损耗,并且仍将大多数文本(罗马字符)存储在单个字节中
>将所有的字符串实例更改为AnsiString可能会有一些工作,您将需要检查与它们调用的所有方法,以查看是否执行了太多的隐式转换(用于性能)等
>您可能需要更改库的外层以使用Unicode,以便转换代码或ANSI / Unicode编译器警告对于您的库的用户不可见
>如果转换为Unicode,则可以使用字符集(不记得语法,可能是MySet中的’S’)won’t work.从您对字符A到U的描述,我可以猜到你想使用这种语法.
我的建议就个人而言,我从您所提供的信息中做到这一点的唯一原因是内存使用,可能的性能取决于您在使用这么大量的A..Us中所做的工作.如果真的很重要,那就是驱动程序和约束,你应该转换为ANSI.