我正在维护一个必须在Windows和Linux机器之间共享数据的项目。 该程序是在2003年在DELPHI(Windows)中开发的 - 因此,未来两个系统必须(至少可能)读取许多遗留数据文件。
我已将程序移植到Lazarus,它在Linux上运行得非常好。
但是数据(以专有格式)将字符串存储为来自#0-#255的通用ascii字符。在linux机器上读取数据导致很多'?' - 符号而不是'ñ,äöüß......等等。
我试图解决问题:
1。)我像往常一样在Windows机器上读取数据。 2.)我用修改后的版本保存了数据,它将使用URLEncode()对所有字符串进行编码 关于储蓄。 3.)我还修改了使用URLDecode读取数据的例程 4.)我用修改后的版本保存了数据。 5.)我在linux上编译了modiefied版本并从windows机器复制了数据。 6.)我打开了有问题的数据......并得到了问号(?)而不是'ñ,äöüß......等等。
那么,实际问题是:如何共享两个系统维护的数据并在编辑数据时保留这些字符(双方)? 提前致谢
答案 0 :(得分:4)
8位Ansi 值介于128-255之间特定于charset 。无论使用何种字符集来保存Windows上的数据(假设您依赖于Windows默认编码,这取决于用户的语言环境),在Linux上加载数据时必须使用相同的字符集,反之亦然。世界上使用的字符集有数十个(如果不是数百个),这使得Ansi数据的可移植性变得困难。这正是Unicode旨在解决的问题。您最好将数据保存在便携式字符集中,例如UTF-8,然后在加载/保存数据时执行与系统字符集的转换。
答案 1 :(得分:3)
考虑将{1}}用于UTF-8。
或者,如果您确定您的数据始终具有相同的代码页,则可以使用从原始Windows代码页转换为UTF-8,这是默认的Linux / Lazarus编码。
如果您希望它是跨平台的,那么最好不要依赖任何专有的二进制布局作为应用程序文件格式。您刚刚发现了字符编码问题,但您可能还有其他问题,例如二进制字节序。 SQLite3非常好all your text storage。它快速,可靠,跨平台,稳定和原子。
答案 2 :(得分:1)
请注意,Lazarus 始终需要GUI的 utf8 字符串。因此,即使在Windows上,如果没有适当的utf8卫生,这可能也行不通。