我正在努力解决外部接口内容的编码问题。在MySQL数据库中,排序规则为latin1_swedish_ci
。该字段的整理也是latin1_swedish_ci
。 php脚本以UTF-8编码,浏览器中的输出为UTF-8。除了这个数据库的内容外,一切正常。数据库连接应为UTF-8(Typo3 4.7),内容为
straße
但它应该是straße
。
mb_detect_encoding($data['street'],'UTF-8')
说它是UTF-8
。如果我使用utf8_decode()
,我会
STRA的ΔE
如果我使用utf8_encode()
,我会
straße
我的假设是UTF-8编码数据存储在ISO-8859-1
中,但如果是这种情况,则不应在此处产生此类问题。我如何找出真正的编码是什么?
PS:我无法更改源代码的编码!
我最初问题的解决方案:
我必须使用这行代码将数据库连接从UTF-8设置为ISO-8859-1
$res = $GLOBALS['TYPO3_DB']->sql_query("SET NAMES latin1");
答案 0 :(得分:3)
根据链接网站,字符ß
'LATIN SMALL LETTER SHARP S' (U+00DF)以字节0xC3
和0x9F
的UTF-8形式存在:
UTF-8(十六进制)0xC3 0x9F(c39f)
如果我们查看ISO-8859-1 codepage layout,那么这些字节代表字符Ã
以及未在ISO-8859-1代码页布局中定义的字符。因此不是这样。与ISO-8859-1有一些重叠的另一种常见字符编码是Windows CP1252(也称为ANSI,在记事本中保存文本文件时默认使用 - 通过使用另存为可以覆盖) 。如果我们查看CP1252 codepage layout,那么这些字节代表字符Ã
和Ÿ
,它们会确认您最初检索的内容。
因此,它最有可能是CP1252编码。
答案 1 :(得分:2)
你所看到的“ß”实际上是windows-1252(也称为CP1252)对构成“ß”的UTF-8编码的两个字节0xC3和0x9F的解释。但这似乎意味着数据实际上是UTF-8编码的,只是被误解为windows-1252编码。所以我认为它应该简单地处理为UTF-8,并采取适当的预防措施。
答案 2 :(得分:1)
我建议你继续验证你的sql连接正在使用什么字符集。它不一定与您为数据库定义的字符集相同。
FROM PHP
// Opens a connection to a MySQL server
$connection = mysql_connect ($server, $username, $password);
$charset = mysql_client_encoding($connection);
$flagChange = mysql_set_charset('utf8', $connection);
echo "The character set is: $charset</br>mysql_set_charset result:$flagChange</br>";
INSIDE PHPMYADMIN
information_schema
schemata
mysql
默认排序规则您可能会也可能无法更改这些参数,具体取决于用户权限。
如上所示,我通过将以下行附加到我的connection.php
文件(我在每个使用数据库访问的页面的开头调用)来解决我在mysql中冲突的字符集问题:
$flagChange = mysql_set_charset('utf8', $connection);