PHP - MySQL数据库中错误编码的土耳其语字符

时间:2015-11-25 15:51:30

标签: php html mysql character-encoding turkish

我正在开发一个土耳其网站,该网站在MySQL数据库中存储了许多格式错误的土耳其语字符,例如:

 - ş as þ
 - ı as ý
 - ğ as ð
 - Ý as İ

我无法更改数据库中的数据,因为数据库每天更新,新数据将再次包含格式错误的字符。所以我的想法是改变PHP中的数据而不是更改数据库中的数据。我尝试了一些步骤:

Turkish characters are not displayed correctly

Fix Turkish Charset Issue Html / PHP (iconv?)

PHP Turkish Language displaying issue

PHP MYSQL encoding issue ( Turkish Characters )

我正在使用GitHub上的PHP-MySQLi-Database-Class和utf8作为字符集。

我甚至尝试用str_replace替换格式错误的字符,例如:

$newString = str_replace ( chr ( 253 ), "ı", $newString );

我的问题是,如何在不更改数据库中的字符的情况下解决问题?有没有最佳做法?这是替换角色的好方法吗?

修改 通过使用

解决了它
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-9" />

2 个答案:

答案 0 :(得分:0)

两种解决方案都很好

PHP MYSQL encoding issue ( Turkish Characters )

PHP Turkish Language displaying issue

您也可以在phpMyAdmin上设置配置

操作&gt;表格选项&gt;整理&gt;选择utf8_general_ci

如果您创建表已经编辑了整理结构

答案 1 :(得分:0)

SELECT CONVERT(CONVERT(UNHEX('d0dddef0fdfe') USING ...) USING utf8);

latin5 / iso-8859-1显示ĞİŞğış
latin1 / iso-8859-9显示ÐÝÞðýþ

你混淆了两个相似的编码;请参阅https://en.wikipedia.org/wiki/ISO/IEC_8859-9中的第一段。

“整理”仅用于排序。但首先您需要将CHARACTER SET更改为latin5。然后将排序规则更改为latin5_turkish_ci。 (由于这是latin5的默认设置,因此无需采取任何措施。)

这个可能足以在MySQL中进行更改:编辑3

NO, this is probably wring -- ALTER TABLE tbl CONVERT TO CHARACTER SET latin5;

在看到更多问题之后,这个“两步ALTER”可能是正确的:

ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...;
ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET latin5 ...;

为每张桌子做这件事。请务必先在数据副本上对此进行测试。

当{em>字节正确时,2-step ALTER非常有用,但CHARACTER SET不正确。

字符正确时,应使用

CONVERT TO,但您需要不同的编码(和CHARACTER SET)。请参阅Case 5

修改1

E7FD以及çý的cp1250,dec8,latin1和latin2。 latin5中的FDı。我的结论是您的编码是latin1,而不是latin5

你说你不能改变“剧本”。让我们来看看你的局限性。你是否被限制在INSERT方面?还是SELECT方?或两者?什么是渲染文本; HTML? MySQL愿意从latin1更改为/从latin5更改并插入/选择(基于一些设置)。和/或你可以欺骗HTML(通过元标记)让它以不同的方式解释字节。请详细说明数据流的详细信息。

修改2

鉴于表中的HEX是E7FD6B6172FD6C6D6173FD6E61,它应该呈现为çıkarılmasına,...特别注意第二个字母需要显示为ı(土耳其无点小) I),而不是ý(小Y带急性),对吗?

首先尝试

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-9"/>

这应该会给你'latin5渲染,正如你已经发现的那样。 IANA Reference

至于“最佳实践”,这将涉及更改文本的插入方式。你已经说过这是禁区。

显然,latin5列中存储了latin5个字符。由于latin1不涉及任何检查,您可以毫无困难地插入和检索latin5字符。

这并不符合土耳其整理的愿望。如果有必要,我可以编造一种方式来指定土耳其语对特定语句的排序;请提供样本声明。

相关问题