如何处理在latin1数据库中存储阿拉伯字符的遗留应用程序

时间:2012-10-28 10:14:03

标签: php utf-8 latin1

我现在使用基于Web的PHP应用程序来处理MySQL服务器数据库 数据库使用Latin1字符集,并且所有波斯文本都没有正确显示 数据库与Windows软件显示和保存波斯文本一起使用 我不想更改charset因为windows软件可以使用该charset。

问题:
如何将latin1转换为utf8以显示和将utf8转换为latin1以便从我的基于Web的PHP应用程序进行保存,或者在latin1 charset数据库中使用波斯语/阿拉伯语语语而没有问题?

注:
 从我的基于Windows的软件保存时,我的其中一个文本为احمد رحمانی,另存为ÇÍãÏ ÑÍãÇäí,并且仍在我的旧基于Windows的软件中显示احمد رحمانی

图片image of database , charsets,collation and windows-based software (full Size) image of database , charsets,collation and windows-based software

1 个答案:

答案 0 :(得分:2)

  

修改:您的屏幕截图显示以下诊断可能是正确的。

     

该怎么做:尝试在PHP Web应用程序中使用iconv()。您必须猜测或找出Windows应用程序使用的排序规则/代码页。

     

然后这样的事情可能有效:

$string_decoded =  iconv("windows-1256", "utf-8", $string); 
     

您可能需要进行试验以使其正常工作。另外,我你需要强制你的数据库连接使用latin1而不是UTF-8!

     

如果您问我,这不是您的网络应用的良好基础。您必须始终将数据转换为损坏的格式。您可能必须破坏与应用程序的兼容性,或编写导入工具。

latin1字符集不包含波斯语字符。 Proof at collation-charts.org

我为什么你的Delphi程序能够在latin1数据库中存储阿拉伯字符的唯一解释是,它可能误用 latin1数据库来存储latin1未涵盖的数据,例如: Windows-1256 Arabic.因此程序将存储每个阿拉伯字符的原始字节,而实际上这些字节被latin1字符集中的其他拉丁字符占用。但只要只有Delphi程序存储和获取数据,没有人注意到。

如果我在这方面是正确的 - 这是我能够看到你所描述的内容的唯一方式 - 只要只涉及应用程序以相同的方式执行此操作 真的错了。

您应该能够通过查看来自“中立”数据库工具(如phpMyAdmin或HeidiSQL)的数据来确认是否是这种情况。如果你看到垃圾而不是阿拉伯语/波斯语字符,我可能是对的。

关于要做什么使您的PHP Web应用程序与您的Delphi应用程序使用相同的数据库 - 我不确定该怎么做才能说实话。据我所知,没有办法强制mySQL使用一种编码而不是另一种编码。在将数据提取到Web应用程序之前,您必须手动“重新编码”数据。这可能是一个痛苦的过程。

但首先,试着找出到底发生了什么。